繁体   English   中英

在带有 Django Rest Framework 的 Django 模型中使用 uuid 作为外键

[英]Use uuid as foreign Key in a model in Django with Django Rest Framework

不知道帖子标题对不对。 我会解释我想要做什么,你可以告诉我什么是最好的方法。

我想在我的用户模型中有一个“id”(Int)作为主键和一个“uuid”(uuid)作为字段。 所以,我想用“id”链接表,因为它更快,但我希望前端只看到“uuid”而不是“id”,因为这样更安全。

我的问题是我有一个“消息”模型。 看起来是这样的:

class Message(models.Model):
    created = models.DateTimeField(auto_now_add=True)

    type = models.CharField(_('type'), choices=MESSAGE_TYPE, default='Invitation', max_length=100)
    content = models.TextField(_('content'), blank=False)
    sender = models.ForeignKey(User, related_name='sender_message', verbose_name=_("Sender"), )
    recipient = models.ForeignKey(User, related_name='receiver_message', null=True, blank=True,
                                  verbose_name=_("Recipient"))
    url_profile_image = models.URLField(_('url_profile_image'), max_length=500, blank=True, default='')

    class Meta:
        ordering = ('created',)

正如您所看到的,“发件人”和“收件人”通过ForeignKey链接到我的用户。 但是该ForeignKey作为用户 ID 返回。

  {
    "url": "http://127.0.0.1:8000/users/messages/4/",
    "id": 4,
    "type": "invitation_accepted",
    "content": "Sure",
    "sender": 4,
    "recipient": 1,
    "url_profile_image": ""
  }

4 是“发件人”的 id,1 是“收件人”的 id。 但我希望前端只看到发件人的“uuid”和收件人的“uuid”。

我的序列化程序看起来是这样的:

class MessageSerializer(serializers.ModelSerializer):

    class Meta:
        model = Message
        fields = ('url', 'id', 'type', 'content', 'sender', 'recipient', 'url_profile_image')

所以,我想也许有两种方法可以做我想做的事。

要么使用 uuid 作为外键,要么在序列化程序中做一些事情并获取用户的 uuid 并在“发送者”和“接收者”中返回它。

我的观点很简单:

class MessageViewSet(viewsets.ModelViewSet):
    queryset = Message.objects.all()
    serializer_class = MessageSerializer

(不要担心查询集,它看起来很疯狂,但确实如此:) 这种消息不是私密的:D)

也许有人可以帮助我。

你可以试试

class MessageSerializer(serializers.ModelSerializer): 
    sender = serializers.ReadOnlyField(source='sender.uid')
    recipient = serializers.ReadOnlyField(source='recipient.uid')

    class Meta: 
        model = Message 
        fields = ('url', 'id', 'type', 'content', 'sender', 'recipient', 'url_profile_image')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM