Я пытаюсь написать собственное обновление для DRF HyperlinkRelatedModel Serializer.Но на самом деле я просто бьюсь головой о стену.
Выдает уникальные ошибки ограничения.Сначала я хотел иметь уникальное ограничение на электронную почту, которое не работало, поэтому я удалил его.Теперь я получаю ту же ошибку в поле uuid
.
Может кто-нибудь, пожалуйста, проведите меня через это и дайте несколько советов по поводу такого рода отношений.
Ниже приведено то, что у меня есть, оно предназначено для создания или обновления Recipient
и добавления его к Email
.
Мне кажется, мне нужно написать какую-то форму пользовательской проверкиЯ не знаю, как это сделать.Любая помощь будет оценена.
{
"recipients": [
{
"uuid": [
"recipient with this uuid already exists."
]
}
]
}
Обновление
Это устраняет ошибку проверки.Теперь я не знаю, как добавить подтверждение для регулярных обновлений.
extra_kwargs = {
'uuid': {
'validators': [],
}
}
Модели
class Recipient(models.Model):
uuid = models.UUIDField(primary_key=True, default=uuid.uuid4)
name = models.CharField(max_length=255)
email_address = models.EmailField()
class Email(models.Model):
uuid = models.UUIDField(primary_key=True, default=uuid.uuid4)
subject = models.CharField(max_length=500)
body = models.TextField()
recipients = models.ManyToManyField(Recipient, related_name='email')
Сериализаторы
from rest_framework import serializers
from rest_framework.exceptions import ValidationError
from schedule_email.models import Recipient, Email, ScheduledMail
class RecipientSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Recipient
fields = ('url', 'uuid', 'name', 'email_address', 'recipient_type')
# I saw somewhere that this might remove the validation.
extra_kwargs = {
'uuid': {
'validators': [],
}
}
class EmailSerializer(serializers.HyperlinkedModelSerializer):
recipients = RecipientSerializer(many=True, required=False)
class Meta:
model = Email
fields = ('url', 'uuid', 'subject', 'body', 'recipients', 'delivery_service')
def create(self, validated_data):
recipient_data = validated_data.pop('recipients')
email = Email.objects.create(**validated_data)
for recipient in recipient_data:
email.recipients.add(Recipient.objects.create(**recipient))
return email
def update(self, instance, validated_data):
recipients_data = validated_data.pop('recipients')
for field, value in validated_data.items():
setattr(instance, field, value)
for recipient_data in recipients_data:
if 'uuid' in recipient_data.keys() and instance.recipients.get(pk=recipient_data['uuid']):
Recipient.objects.update(**recipient_data)
elif 'uuid' in recipient_data.keys() and Recipient.objects.get(pk=recipient_data['uuid']):
instance.recipients.add(Recipient.objects.update(**recipient_data))
elif 'uuid' in recipient_data.keys():
raise ValidationError('No recipient with this UUID was found: %s' % recipient_data['uuid'])
else:
recipient = Recipient.objects.create(**recipient_data)
instance.recipients.add(recipient)
return instance
Ниже приведен пример сообщения / путпросьба, которую я мог бы сделать.Мне, вероятно, не нужно поле uuid
, которое я не смог понять, как получить экземпляр Recipient
из URL-адреса гиперссылки.
Пример Post / Put
{
"subject": "Greeting",
"body": "Hello All",
"recipients": [
{
"url": "http://localhost:8000/api/recipient/53614a41-7155-4d8b-adb1-66ccec60bc87/",
"uuid": "53614a41-7155-4d8b-adb1-66ccec60bc87"
"name": "Jane",
"email_address": "jane@example.com",
},
{
"name": "John",
"email_address": "john@example.com",
}
],
}