2017-01-18 2 views
0

Je ne sais pas si le titre de la publication est correct. Je vais vous expliquer ce que je veux faire et vous pourriez me dire quelle est la meilleure façon.Utiliser uuid comme clé étrangère dans un modèle dans Django avec Django Rest Framework

Je veux avoir un "id" (Int) comme clé primaire et un "uuid" (uuid) comme champ dans mon modèle d'utilisateur. Donc, je veux lier les tables avec le "id", parce que c'est plus rapide, mais je veux que le front ne voit que le "uuid" et jamais le "id", parce que c'est un peu plus sûr.

Mon problème est que j'ai un modèle de "message". Il a l'air si:

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',) 

Et comme vous pouvez le voir, « expéditeur » et « destinataire » sont liés à mon utilisateur avec un ForeignKey. Mais ForeignKey renvoie l'ID utilisateur.

{ 
    "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 est l'identifiant de "l'expéditeur" et 1 est l'identifiant du "destinataire". Mais je voudrais que l'avant voie juste voir le "uuid" de l'expéditeur et le "uuid" du destinataire.

Mon sérialiseur a l'air si:

class MessageSerializer(serializers.ModelSerializer): 

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

Alors, je pensais que peut-être il sont deux façons de le faire ce que je veux. Utilisez l'uuid comme clé étrangère ou faites quelque chose dans le sérialiseur et récupérez l'uuid de l'utilisateur et renvoyez-le dans "expéditeur" et "destinataire".

Mon point de vue est assez simple:

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

(ne vous inquiétez pas au sujet de la queryset, il semble fou, mais il est tellement :) ce genre de message n'est pas privé: D)

Peut-être quelqu'un peut m'aider.

Répondre

1

Vous pouvez

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') 
+0

Sweet. Merci! Je ne savais pas que ça marcherait. –