Таким образом, я получаю эту ошибку. Прямое назначение обратной стороне связанного набора запрещено. Вместо этого используйте emails.set ().
Вот так выглядит мой код
class Client(models.Model):
class Email(models.Model):
client = models.ForeignKey(Client, on_delete=models.CASCADE, related_name='emails', null=True, blank=True)
email = models.CharField(null=True, blank=True, max_length=50)
class EmailSerializer(serializers.ModelSerializer):
class Meta:
model = Emailfields = '__all__'
class ClientSerializer(serializers.ModelSerializer):
emails = EmailSerializer(required=False, allow_null=True, many=True)
def update(self, instance, validated_data):
# Update all fields of Client.
[setattr(instance, k, v) for k, v in validated_data.items()]
instance.save()
return instance
Так что клиент может иметь много писем. При вызове update указывается, что прямое назначение обратной стороне связанного набора запрещено. Вместо этого используйте emails.set ().
Этого сообщения об ошибке можно избежать, удалив электронные письма из validated_data с помощью let emailsData = validated_data.pop ('emails', []).
, ноПосле этого я не уверен, что делать дальше, чтобы обновить массив писем, если он нуждается в обновлении, или удалить его, если его больше нет в массиве emailsData.
json выглядит следующим образом
{ id: 10, name: 'test', emails: [ { id: 1, emailType: 'Work', email: 'test@gmail.com', client_id: 10 } ] }
и у меня есть эта форма, где вы можете добавлять / удалять поля электронной почты, если у клиента более 1 электронного письма. поэтому, если я добавлю еще одну строку электронной почты, не задав адрес электронной почты, массив будет отправлен в JSON, включая его. поэтому в django я проверяю, пусто ли письмо, не вставляйте.
это работает нормально при создании. но тогда моя дилемма во время обновления. если идентификатор электронной почты такой же, обновите его, иначе, если 0, вставьте. мне также нужно определить, какие поля электронной почты удалять, если пользователь решил удалить один из своих существующих адресов электронной почты.
проще всего было бы просто удалить все и воссоздать записи электронной почты на основе массива, но я не хочуэто как я не хочу, чтобы счетчик идентификаторов был потрачен впустую.
Мысли?