Django Rest Framework - 嵌套序列化器的限制字段

问题描述:

我有UserItem模型,并且在Item.objects.all()视图中存在嵌套Items的问题。具体来说,我得到的ItemListView资源如下:Django Rest Framework - 嵌套序列化器的限制字段

[ { 
"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" 

},

我要的是从输出排除User.items。我怎样才能做到这一点与串行和车型如下:

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 

型号:

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'] 

没有开箱即用解决方案的动态设置要序列上的相关模型的字段。

要么你需要定义一个精简副本UserSerializer并用它里面ItemSerializer(可以将其定义权内ItemSerializer类不污染命名空间),或延长ModelSerializer和手动实现动态领域系列化一定支撑,看到here对于一些想法(如果你想深入几层,我会想象这会变得棘手)。

+0

不幸的是,这与我的想法有关。感谢您的确认。 – Jason