【问题标题】:DRF Serializer foreign key reverse lookupDRF 序列化器外键反向查找
【发布时间】:2018-06-12 22:10:11
【问题描述】:

我正在尝试发送以下 HTTP Post API 请求以创建新的 EventInterest 对象。如何在最小的有效负载中完成此操作,而不是发送整个对象?我正在尝试通过混淆进行额外的安全层,而不是使用默认整数pk,我如何使用uuid 表示Eventusername 表示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 发布:

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

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    正如您在Event 模型中定义uuid 一样,您也必须在User 模型中定义uuid。为此,您必须扩展默认用户模型。然后你必须重写 EventInterestSerializercreate() 方法来查找相应的 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")
    

    【讨论】:

      【解决方案2】:

      您需要将 UUIDField 设为主键。就像这样:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-19
        • 1970-01-01
        • 2019-02-11
        • 1970-01-01
        • 2020-01-02
        相关资源
        最近更新 更多