В чем разница между этими двумя методами обновления БД с помощью формы?
Я пытаюсь обновить базу данных с помощью формы. Я хочу выбрать название в выпадающем списке, и обновить поле 'opening_crawl' до ввода из текстовой области.
models.py :
class Movies(models.Model):
episode_nb = models.IntegerField(primary_key=True)
title = models.CharField(max_length=64, unique=True, null=False)
opening_crawl = models.TextField(null=True)
director = models.CharField(max_length=32)
producer = models.CharField(max_length=128)
release_date = models.DateField()
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True, editable=True)
forms.py:
class TitleDropDownForm(forms.Form):
title = forms.ModelChoiceField(queryset=Movies.objects.only('title'), empty_label=None)
opening_crawl = forms.CharField(widget=forms.Textarea)
views.py:
def update(request):
msg = ''
if request.method == 'POST':
form = TitleDropDownForm(request.POST)
if form.is_valid():
#method 1 : it updates 'opening_crawl' properly, but not 'updated_time'.
movie = form.cleaned_data['title']
movie.opening_crawl = form.cleaned_data['opening_crawl']
movie.save()
#method 2
#h = Movies.objects.get(pk=1)
#h.opening_crawl = 'HAND WRITTEN MESSAGE!'
#h.save()
return redirect(request.META.get('HTTP_REFERER'))
else:
form = TitleDropDownForm()
if not form.fields['title'].queryset:
msg = 'No data available.'
return render(request, 'ex07/update.html', context={'form' : form, 'msg' : msg})
Метод 1 работает с полем 'opening_crawl', но поле 'updated' datetime не изменилось. Когда я попробовал метод 2, он обновляет оба поля правильно. В чем разница между двумя методами? Есть ли здесь какое-то недопонимание?
Я подозреваю, что это потому, что вы используете .only()
Из документации Django:
При сохранении модели, полученной с помощью отложенной загрузки модели (only() или defer()), обновляются только поля, загруженные из БД. По сути, в этом случае происходит автоматическое обновление полей (update_fields). Если вы присвоите или измените значение любого отложенного поля, оно будет добавлено в обновленные поля.
Во втором методе вы получаете всю модель, без отложенных полей (т.е. updated
)