Django REST Framework: отношения ManyToMany - PullRequest
1 голос
/ 07 апреля 2020

В настоящее время я работаю над проектом Django, я новичок в этом, и трудно найти четкую документацию по этому поводу.

Моя проблема очень проста, я хочу при создании моего модель, автоматически связывает другую модель с помощью отношения ManyToMany.

Вот код:

Модель:

class Favorite(models.Model):
    uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    title = models.CharField(max_length=60, blank=False)
    estates = models.ManyToManyField(Estate, blank=True)

Сериализатор:

class FavoriteSerializer(serializers.ModelSerializer):
    estates = EstateSerializer(read_only=True, many=True)

    class Meta:
        model = Favorite
        fields = ['uuid', 'title', 'estates']

    def create(self, validated_data):
        instance = super(FavoriteSerializer, self).create(validated_data)
        instance.save()

        return instance

ViewSet:

class MyFavoriteEstatesListViewSet(viewsets.ModelViewSet):
    serializer_class = FavoriteSerializer

    def get_queryset(self):
        return Favorite.objects.filter(users__id=self.request.user.id)

В настоящее время я отправляю что-то подобное через POST:

{"title": "some title", "estate_uuid": "XXX"}

Я просто хотел создать экземпляр своей модели Estate с помощью только что отправленного UUID и добавить его с помощью

favorite.estates.add(estate)

Как мне этого добиться?

Спасибо за помощь!

1 Ответ

0 голосов
/ 07 апреля 2020

Я думаю, вы можете попробовать что-то вроде этого:

class EstateField(serializers.RelatedField):
   def to_representation(self, obj):
       return EstateSerializer(obj).data

   def to_internal_value(self, data):
       return Estate.objects.get(pk=data)

class FavoriteSerializer(serializers.ModelSerializer):
    estates = EstateField(many=True, queryset=Estate.objects.all())

    class Meta:
        model = Favorite
        fields = ['uuid', 'title', 'estates']

Я использую Custom Fields, чтобы представить данные в виде словаря, но принять ввод как uuid.

...