2015-07-19 13 views
13

Więc jakiś czas kilka migracje po moim pierwszym, postanowiłem chciałem zawierać następujące pola:Django 1.8 Migracje. Dodawanie DateTimeField po utworzeniu db. Najlepsze praktyki?

created = models.DateTimeField(auto_now_add=True) 
modified = models.DateTimeField(auto_now=True) 

do jednego z moich modeli. Kiedy makemigrations dał mi You are trying to add a non-nullable field 'created' to episode without a default; we can't do that (the database needs something to populate existing rows).

Więc potem zmienił je na

created = models.DateTimeField(auto_now_add=True, default=datetime.now) 

Po próbie makemigrations ponownie, to powiedział, że at_api.Episode.modified: (fields.E160) The options auto_now, auto_now_add, and default are mutually exclusive. Only one of these options may be present.

Dobra, więc po prostu poszedł do przodu i wyjętym auto_now_add

created = models.DateTimeField(default=datetime.now) 

mogłem teraz makemigrations bez żadnych problemów. Później usunąłem default=datetime.now i zastąpiłem go auto_now_add=True i ponownie wykonałem migrację bez żadnych problemów. Jednak nie mogę oprzeć się wrażeniu, że nie jest to najlepszy sposób robienia rzeczy. Czuję, że coś może pójść nie tak później w projekcie.

Odpowiedz

7

Myślę, że najlepszą praktyką byłby tutaj, aby pól pustych. Co danej dziedzinie created oznacza w tej chwili jest: „Czas, gdy instancja została stworzona, lub arbitralnego czas, kiedy wpadłem migracji.” Standardowy sposób reprezentowania braku wartości to NULL, a nie arbitralna wartość.

Powiedział, że jeśli chce korzystać z niektórych dowolną wartość wystarczy powiedzieć Django co to jest. Zazwyczaj makemigrations daje możliwość wskazania jednorazowej wartości do użycia w istniejących wierszach - czy to się nie stało?

bardziej pracochłonny sposób byłoby zadeklarować pustych pól, a następnie utworzyć migracji danych, aby podać żądaną wartość, a następnie zrobić to bez pustych. To, co zrobiłeś, jest w zasadzie uproszczoną wersją tego. Nie widzę żadnych problemów z poruszaniem się do przodu innych niż wydanie created tak naprawdę nie jest to czas utworzenia instancji.

+0

Tak, Django nie pytaj mnie o jednorazowej wartości dla istniejących wierszy. Próbowałem 'datetime.now', ale nie działa. Ale chyba wszystko w porządku? Czy typowe jest ustawienie 'null = True' jako" symbolu zastępczego "dla istniejących wartości wierszy, a następnie usunięcie go później w celu zastąpienia czymś innym? – pyramidface

+0

'datetime.now()' zadziałałoby (zanotuj nawiasy - chcesz * wywołać * funkcję i użyć jej wartości zwracanej). Dodałeś i usunąłeś 'null = True' w bardziej skomplikowanych przypadkach, w których chcesz przypisać inną wartość do różnych wierszy. Na przykład, powiedzmy, że masz rzeczywistą datę utworzenia przechowywaną gdzieś w pliku. Napiszesz migrację danych, która dla każdego wiersza wyszuka datę w pliku, a następnie umieści go w bazie danych. Następnie możesz usunąć 'null = True' i ponownie przeprowadzić migrację. –

+0

Ahh OK, będę o tym pamiętać w przyszłych projektach. Dzięki!! – pyramidface

1

Właśnie miałem dokładnie problem. Używam Django 1.10. Przeczytałem odpowiedź Kevina i próbowałem ustawić domyślną wartość, gdy Django poprosił mnie o wypełnienie go jako ciąg znaków datetime.now. i byłem zaskoczony, ponieważ dla tych dziedzinach, Django automatycznie zapyta, czy chcesz korzystać datetime.now jako domyślne

$ ./manage.py makemigrations 
You are trying to add the field 'date_created' with 'auto_now_add=True' to projectasset without a default; the database needs something to populate existing rows. 

1) Provide a one-off default now (will be set on all existing rows) 
2) Quit, and let me add a default in models.py 
Select an option: 1 
Please enter the default value now, as valid Python 
You can accept the default 'timezone.now' by pressing 'Enter' or you can provide another value. 
The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now 
Type 'exit' to exit this prompt 
[default: timezone.now] >>> 

Więc, po prostu potwierdzić, że wszystko wydaje się działać dobrze!