簡體   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