Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django Rest框架-限制嵌套序列化程序的字段_Django_Serialization_Django Rest Framework - Fatal编程技术网

Django Rest框架-限制嵌套序列化程序的字段

Django Rest框架-限制嵌套序列化程序的字段,django,serialization,django-rest-framework,Django,Serialization,Django Rest Framework,我有用户和项目模型,并且在项目.objects.all()视图中嵌套的项目存在问题。具体来说,我在ItemListView资源中获得了以下内容: [ { "id": 3, "description": "Some test item description", "user": { "id": 10, "username": "jason", "email": "test@test.com", "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1N

我有
用户
项目
模型,并且在
项目.objects.all()视图中嵌套的
项目
存在问题。具体来说,我在
ItemListView
资源中获得了以下内容:

[  {
"id": 3,
"description": "Some test item description",
"user": {
  "id": 10,
  "username": "jason",
  "email": "test@test.com",
  "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
并手动实现对动态字段序列化的一些支持,有关一些想法,请参阅(如果你想深入几层,这可能会很棘手。)

不幸的是,这就是我的想法。谢谢你的确认。