DRF сериализуется через данные связанных моделей

У меня проблема с сериализацией DRF. Моя основная цель - создать экземпляр со связанным полем, но вместо предоставления связанных моделей id я хочу использовать другое уникальное поле. В то же время, когда я буду сериализовать свою модель, чтобы представить ее (не создавать), я хотел бы получить значение связанных полей по умолчанию. Вот пример

class Comment(models.Model):

    description = models.TextField()
    creator = models.ForeignKey(User, ...)


x = Creator.objects.get(pk=1)
print(x.unique_field)
> 'some data'
client.post('comment-detail', data={
                                     'description': 'some description',
                                     'creator_unique_field': 'some data'
                                    })
# this should create a comment while using some unique creators field
# which is not pk or id

print(client.get('comment-detail', data={'pk':1}))
{
  'description' 'some description',
  'creator': 1,
}
        

Я не знаю, следует ли мне изменить сериализатор моделей ViewSet create() и retrieve(). Я начинаю с DRF и не могу понять это


person quqa123    schedule 12.12.2020    source источник


Ответы (1)


Переопределение метода создания Serializer — хорошее место для этого. там можно запросить пользователя unique_field.

class CommentView(viewsets.ModelViewSet):
    def perform_create(self, serializer):
        serializer.save(creator=self.request.user)

class CommentSerializer(serializers.Serializer):

    creator_unique_field = serializer.SomeField()        

    def create(self, validated_data):
        creator = Creator.objects.get(unique_field=validated_data['creator_unique_field'])
        comment, created = Comment.objects.get_or_create(creator=creator, **validated_data)

        return comment

    class Meta:
        model = Comment
        fields = '__all__'
person Michael Lindsay    schedule 12.12.2020