2017-11-02 6 views
1

Ich versuche, meine Benutzer Tabelle in meine Beziehungen Tabelle zu verschachteln. Anstatt also diese:Django Rest Framework Fremdschlüssel Verschachtelung

[ 
    { 
     "user": 1, 
     "related_user": 2, 
     "relationship": "followed_by" 
    } 
] 

Ich versuche, dies zu erhalten:

[ 
    { 
     "user": { 
      "username": "user1", 
      "name": "User 1", 
      "email": "bla", 
      "phone": "bla", 
      "date_joined": "2017-11-01T21:34:13.101256Z" 
     }, 
     "related_user": { 
      "username": "user2", 
      "name": "User 2", 
      "email": "bla", 
      "phone": "bla", 
      "date_joined": "2017-11-01T21:34:13.101256Z" 
     }, 
     "relationship": "followed_by" 
    } 
] 

ich Tutorien nachgeschlagen und ich versuchte das Hinzufügen serializers.RelatedField , UserSerializer(many=true, read-only=true) etc., aber nichts funktionierte

Models.py

class User(models.Model): 
    username = models.CharField(max_length=255) 
    name = models.CharField(max_length=255) 
    email = models.CharField(max_length=255) 
    phone = models.CharField(max_length=255) 
    date_joined = models.DateTimeField(auto_now_add=True, blank=True) 

    def __str__(self): 
     return str(self.pk) + ", " + self.username 


RELATIONSHIP_CHOICE = [ 
    ("follows", "follows"), 
    ("followed_by", "followed_by"), 
    ("none", "none"), 
] 

class Relationship(models.Model): 
    user = models.ForeignKey(User, related_name="primary_user", null=True) 
    related_user = models.ForeignKey(User, related_name="related_user", null=True) 
    relationship = models.CharField(max_length=40, choices=RELATIONSHIP_CHOICE, default=RELATIONSHIP_CHOICE[0]) 

Serializers.py

from rest_framework import serializers 
from . import models 

class UserSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = models.User 
     fields = (
      'username', 
      'name', 
      'email', 
      'phone', 
      'date_joined', 
     ) 


class RelationshipSerializer(serializers.ModelSerializer): 
    related_user = UserSerializer(many=True) 

    class Meta: 
     model = models.Relationship 
     fields = (
      'user', 
      'related_user', 
      'relationship', 
      'related_user' 
     ) 

Ich habe versucht, verwandte Benutzer zu meinem Serialisierer hinzuzufügen, aber es hat nicht funktioniert. Ich erhalte einen Fehler: 'Benutzer' Objekt ist nicht iterierbar

Jede Hilfe wird geschätzt.

Antwort

2
class RelationshipSerializer(serializers.ModelSerializer): 
    user = UserSerializer(read_only=True) 
    related_user = UserSerializer(read_only=True) 

    class Meta: 
     model = models.Relationship 
     fields = (
      'user', 
      'related_user', 
      'relationship' 
     ) 

user = UserSerializer(read_only=True, many=True) ist für ManyToMany Feld ist user = UserSerializer(read_only=True) für ForeignKey Feld.

+0

Funktioniert gut! Ich habe mich gefragt, wie ich bestimmte Felder erscheinen lassen kann, zum Beispiel möchte ich den Benutzern keine E-Mails zeigen. Wie kann ich das tun –

+0

die einfachste und effizienteste Möglichkeit, wie ich weiß, ist ersetzen "UserSerializer" mit "UserWithoutEmailSerializer" – Ykh

Verwandte Themen