Обратный просмотр внешнего ключа сериализатора DRF - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь отправить следующий HTTP-запрос API Post для создания нового объекта EventInterest.Как я могу выполнить это в наименьшей полезной нагрузке вместо отправки всего объекта?Я пытаюсь использовать дополнительный уровень защиты через запутывание и вместо целого числа по умолчанию pk, как я могу использовать uuid для Event и username для User?.... Или дополнительные запросы SQL сводят на нет преимущества упрощения полезной нагрузки, и я должен просто использовать pk?

models.py

class Event(models.Model):
    name = models.CharField(max_length=255)
    description = models.TextField(max_length=500)
    uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, db_index=True, blank=True)

class EventInterest(models.Model):
    event = models.ForeignKey(Event)
    sender = models.ForeignKey(settings.AUTH_USER_MODEL)  # from User

api.py

class EventInterestViewSet(mixins.CreateModelMixin, GenericViewSet):

    queryset = models.EventInterest.objects.all()
    serializer_class = serializers.EventInterestSerializer
    lookup_field = 'uuid'

serializer.py

class EventInterestSerializer(serializers.ModelSerializer):
    # event = serializers.SlugRelatedField(read_only=True, slug_field='uuid')
    # recipient = serializers.SlugRelatedField(read_only=True, slug_field='username')
    # sender = serializers.SlugRelatedField(read_only=True, slug_field='username')

    class Meta:
        model = models.EventInterest
        fields = (
            'event',  #works with pk, want uuid
            'sender',  # works with pk, want username
        )

HTTP Post:

{
    "event": "da9290c6-f6f8-4d27-bfe0-d388ed911fe8",
    "sender":"eX8gkxJNDREv"  //this is the username field
}

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Как вы определили uuid в Event модели, вы также должны определить uuid в User модели.Чтобы сделать это, вы должны расширить модель пользователя по умолчанию.Затем необходимо переопределить метод create() для EventInterestSerializer, чтобы выполнить поиск в соответствующем поле UUID вместо pk

models.py

from django.contrib.auth.models import AbstractUser


class User(AbstractUser):
    uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, db_index=True)


class Event(models.Model):
    name = models.CharField(max_length=255)
    description = models.TextField(max_length=500)
    uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, db_index=True)


class EventInterest(models.Model):
    event = models.ForeignKey(Event)
    sender = models.ForeignKey(User)


serializer.py

class EventInterestSerializer(serializers.ModelSerializer):
    class Meta:
        model = EventInterest
        fields = ('event', 'sender',)

    def create(self, validated_data):
        try:
            return EventInterest.objects.get(event__uuid=validated_data['event'],
                                             sender__uuid=validated_data['sender'])
        except EventInterest.DoesNotExist:
            raise serializers.ValidationError("No matching data found")
0 голосов
/ 13 июня 2018

Вам нужно сделать свой UUIDField первичным ключом.Просто так:

class Event(models.Model):
    uuid = models.UUIDField(primary_key=True, default=uuid.uuid4)
    ....
...