use*_*776 3 foreign-keys django-generic-views django-serializer django-rest-framework
我有 3 个不同的序列化器,用于父对象和子对象的 3 个不同视图。意见是CreateAPIView,,ListAPIView。RetrieveAPIView
因此,我CreateAPIView有一个用于创建对象的序列化器,ListAPIView有一个用于列出对象的序列化器,还有RetrieveAPIView一个用于显示对象的详细信息的序列化器。对于子对象和父对象都是如此。
如何列出父对象中与其相关的所有子对象?这意味着RetrieveAPIView我想在父级中展示ListAPIView 其子级。
楷模:
class Boards(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
name = models.CharField(max_length=50, blank=False, null=False, unique=True)
slug = models.SlugField()
def __str__(self):
return self.name
def save(self, *args, **kwargs):
self.slug = slugify(self.name)
super(Boards, self).save(*args, **kwargs)
class Lists(models.Model):
name = models.CharField(max_length=50, blank=False, null=False, unique=True)
slug = models.SlugField()
board = models.ForeignKey(Boards, on_delete=models.CASCADE)
def __str__(self):
return self.name
def save(self, *args, **kwargs):
self.slug = slugify(self.name)
super(Lists, self).save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
序列化器:
class BoardCreateSerializer(ModelSerializer):
# user = request.user
class Meta:
model = Boards
fields = ['name']
class BoardListSerializer(ModelSerializer):
url = HyperlinkedIdentityField(
view_name = 'trello:board-detail',
lookup_field = 'slug',
)
user = SerializerMethodField()
class Meta:
model = Boards
fields = ['url', 'name', 'user']
def get_user(self, obj):
return str(obj.user.username)
class BoardDetailSerializer(ModelSerializer):
user = SerializerMethodField()
class Meta:
model = Boards
fields = ['id', 'name', 'user']
def get_user(self, obj):
return str(obj.user.username)
Run Code Online (Sandbox Code Playgroud)
同样,我也有列表的序列化器。( boards- parent object, lists-children)。
如何在Boards与其相关的详细视图中显示所有列表?
您可以通过不同的方式来执行此操作:
source通过将此字段添加到以下内容来使用参数BoardDetailSerializer:
class BoardDetailSerializer(ModelSerializer):
user = SerializerMethodField()
lists = ListSerializer(
source='Lists_set',
many=True
)
class Meta:
model = Boards
fields = ['id', 'name', 'user', 'lists']
def get_user(self, obj):
return str(obj.user.username)
Run Code Online (Sandbox Code Playgroud)您也可以使用SerializerMethodField()与用户相同的方式。在该方法中,您需要通过序列化器传递列表并获取 json 格式的数据(假设您使用默认的 json 渲染器)
| 归档时间: |
|
| 查看次数: |
5115 次 |
| 最近记录: |