В чем разница между этими двумя методами обновления БД с помощью формы?

Я пытаюсь обновить базу данных с помощью формы. Я хочу выбрать название в выпадающем списке, и обновить поле '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)

Вернуться на верх