2017-04-01 5 views
0

Ich habe User und Item Modelle, und habe ein Problem mit verschachtelten Items in einer Item.objects.all() Ansicht. Insbesondere bin ich immer die folgende in der ItemListView Ressource:Django Rest Framework - Begrenzende Felder Verschachtelung Serializer

[ { 
"id": 3, 
"description": "Some test item description", 
"user": { 
    "id": 10, 
    "username": "jason", 
    "email": "[email protected]", 
    "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0aW1lIjoiRnJpIE1hciAyNCAyMDo1NDo1OSAyMDE3IiwidXNlcm5hbWUiOiJqYXNvbiJ9.x4qdTF5eVKGLnrkcunm63n4d_X8xEzEYM0z48E5HKh4", 
    "items": [ 
    { 
     "id": 3, 
     "description": "Some item description", 
     "timestamp": "2017-03-25T15:50:08.265780Z", 
     "user": 10 
    }, 
    { 
     "id": 2, 
     "description": "test item description", 
     "timestamp": "2017-03-24T22:28:49.904198Z", 
     "user": 10 
    } 
    ] 
}, 
"timestamp": "2017-03-25T15:50:08.265780Z" 

},

Was ich will, ist die User.items von der Ausgabe ausgeschlossen. Wie kann ich das mit den Serializer und Modelle unter:

class UserSerializer(serializers.ModelSerializer): 
    password = serializers.CharField(write_only = True, required = False) 
    confirm_password = serializers.CharField(required = False) 

    class Meta: 
     model = User 
     fields = ('id', 'username', 'email', 'password', 'confirm_password', 'token', 'posts') 
     read_only_fields = ('confirm_password',) 
     depth = 1 

    def create(self, validated_data): 
     return User.objects.create_user(**validated_data) 

    def validate(self, data): 
     if data['password'] != data['confirm_password']: 
     raise ValidationError('Passwords do not match') 

     return data 

class ItemSerializer(serializers.ModelSerializer): 
    user = UserSerializer(read_only = True) 

    def create(self, validated_data): 
     return Item.objects.create(**validated_data) 

    class Meta: 
     fields = ('id', 'content', 'user', 'timestamp') 
     read_only_fields = ('timestamp',) 
     model = Item 
     depth = 1 

Modelle:

class User(AbstractBaseUser, PermissionsMixin): 
    username = models.CharField(max_length = 50, 
           unique = True) 
    email = models.EmailField(unique = True, blank = False, null = False) 
    token = models.CharField(max_length = 255, 
          default = '') 

    objects = UserManager() 

    USERNAME_FIELD = 'username' 

    def generate_token(self): 
     self.token = User.objects.generate_token(user = self) 
     self.save() 

    @python_2_unicode_compatible 
    def __str__(self): 
     return '{} [Username: {}] [Email: {}]'.format(self.pk, 
                 self.username, 
                 self.email) 

    class Meta: 
     verbose_name = 'user' 
     verbose_name_plural = 'users' 


class Item(models.Model): 
    description = models.CharField(db_index = True, max_length = 1000) 
    timestamp = models.DateTimeField(auto_now_add = True, db_index = True) 
    user = models.ForeignKey(User, 
          on_delete = models.CASCADE, 
          related_name = 'items') 

    def __str__(self): 
     return '{} [User: {}] [Timestamp: {}] [Slug {}]'.format(self.pk, self.user.pk, self.timestamp, self.description[:20]) 

    class Meta:  
     verbose_name = 'item' 
     verbose_name_plural = 'items' 
     ordering = ['-timestamp'] 

Antwort

0

Es gibt keine aus der Box Lösung ist dynamisch festgelegt, welche Felder auf ähnliche Modelle serialisiert werden soll.

Sie müssen entweder eine vereinfachte Kopie UserSerializer definieren und verwenden Sie es innerhalb ItemSerializer (es kann innerhalb ItemSerializer Klasse definieren Recht nicht den Namensraum verschmutzen) oder die ModelSerializer erweitern und manuell eine gewisse Unterstützung für dynamisches Feld Serialisierung zu implementieren, siehe here für einige Ideen (das könnte knifflig werden, wenn man ein paar Schichten tiefer gehen möchte, würde ich mir vorstellen).

+0

Das ist, was ich leider dachte. Danke für die Bestätigung. – Jason

Verwandte Themen