Django Rest Framework - 嵌套序列化器的限制字段
问题描述:
我有User
和Item
模型,并且在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对于一些想法(如果你想深入几层,我会想象这会变得棘手)。
不幸的是,这与我的想法有关。感谢您的确认。 – Jason