Сериализатор Django возвращает пустой словарь при создании
У меня есть модель, которая в основном объединяет двух разных пользователей:
class Couple(models.Model):
id = models.UUIDField(
primary_key=True,
default=uuid.uuid4,
editable=False)
user1 = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
null=True,
blank=False,
related_name="user1"
)
user2 = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
null=True,
blank=False,
related_name="user2"
)
def __str__(self):
return str(self.id)
Далее я создал Serializer, в котором user1 приглашает user2 создать пару. И я хочу сделать это, написав адрес электронной почты пользователя2:
class CreateCoupleSerializer(serializers.Serializer):
partner_email = serializers.EmailField(write_only=True, max_length=250,
required=True)
def create(self, validated_data):
partner_email = validated_data['partner_email']
try:
partner = User.objects.get(email=partner_email)
except Exception:
partner = None
if not partner:
raise serializers.ValidationError(
{"details": 'User does not exist'})
if partner.couple_id:
raise serializers.ValidationError(
{"details": 'User is already assigned to a couple'})
user = self.context['request'].user
couple = Couple.objects.create(user1=user, user2=partner)
user.couple_id = couple.id
partner.couple_id = couple.id
user.save()
partner.save()
return couple
А вот мое мнение:
class CreateCoupleView(generics.CreateAPIView):
serializer_class = CreateCoupleSerializer
queryset = Couple.objects.all()
Протестировав это, я вижу, что пара создается, что замечательно! Однако в моем теле ответа я получаю пустой словарь вместо нового экземпляра пары.
Мой вопрос - почему это происходит?
Бонусный вопрос: Когда я должен создавать логику в def create() на стороне Serializer и def create() на стороне View?
Заранее спасибо.
Я исправил это, заменив его на serializers.ModelSerializer
и определив read_only_fields
следующим образом:
class CreateCoupleSerializer(serializers.ModelSerializer):
partner_email = serializers.EmailField(write_only=True, max_length=250,
required=True)
class Meta:
model = Couple
fields = '__all__'
read_only_fields = ('user1', 'user2', )