Я пытаюсь реализовать метод update
для вложенных представлений в Django Rest Framework.
from django.db import models
from django.utils import timezone
from rest_framework import serializers
class Foo(models.Model):
pass
class Bar(models.Model):
foo = models.ForeignKey(Foo, on_delete=models.CASCADE, null=False, related_name='bars')
name = models.CharField(max_length=255)
create_date = models.DateField(null=False)
class BarSerializer(serializers.ModelSerializer):
create_date = serializers.DateField(default=timezone.now)
class Meta:
model = Bar
fields = ('name', 'create_date',)
class FooSerializer(serializers.ModelSerializer):
bars = BarSerializer(many=True, required=False)
def create(self, validate_data):
bars_data = validated_data.pop('bars', [])
foo = Foo.objects.create(**validated_data)
for bar_data in bars_data:
Bar.objects.create(foo=foo, **bar_data)
return foo
def update(self, instance, validated_data):
bars_data = validated_data.pop('bars', None)
if bars_data is not None:
Bar.objects.filter(foo=instance).delete()
for bar_data in bars_data:
Bar.objects.create(foo=instance, **bar_data)
return super().update(instance, validated_data)
class Meta:
model = Foo
fields = ('bars',)
При создании объекта я получаю ожидаемые результаты, но всякий раз, когда я хочу обновить список баров, без предоставления create_date
, я получаю сообщение об ошибке, говорящее, что create_date
не может быть None
(что правильно):
django.db.utils.IntegrityError: Сбой ограничения NOT NULL: myapp_bar.create_date
Если я напечатаю bars_data
внутри update
, я вижу, что он не получает значение по умолчанию от timezone.now
. Его нет в словаре вообще.
Как мне получить доступ к значению по умолчанию здесь? Он должен был пройти проверку сериализатора, почему не добавлено значение по умолчанию?