Django 如何使用中间模型实现嵌套表示?
我对Django和Django Rest框架非常陌生 在我的项目中,我喜欢使用Django 如何使用中间模型实现嵌套表示?,django,django-rest-framework,Django,Django Rest Framework,我对Django和Django Rest框架非常陌生 在我的项目中,我喜欢使用ListAPIView显示中间模型的信息,还包括与中间模型连接的另一个模型的详细信息,该模型具有嵌套表示形式的外键关系 我的项目中有3个模型,用户,内容,书签 我的模型如下 class MyUser(AbstractBaseUser, PermissionsMixin): email = models.EmailField(unique=True) username = models.CharField
ListAPIView
显示中间模型的信息,还包括与中间模型连接的另一个模型的详细信息,该模型具有嵌套表示形式的外键关系
我的项目中有3个模型,用户
,内容
,书签
我的模型如下
class MyUser(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(unique=True)
username = models.CharField(max_length=50)
joined_date = models.DateTimeField(auto_now_add=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
facebook_id = models.CharField(max_length=50, blank=True)
is_facebook = models.BooleanField(default=False)
is_active = models.BooleanField(default=False)
class Content(models.Model):
seq = models.CharField(max_length=20, unique=True)
title = models.CharField(max_length=100, null=True)
start_date = models.DateField(null=True)
end_date = models.DateField(null=True)
place = models.TextField(null=True)
realm_name = models.TextField(null=True)
area = models.TextField(null=True)
price = models.TextField(null=True)
content = models.TextField(null=True)
ticket_url = models.TextField(null=True)
phone = models.TextField(null=True)
thumbnail = models.TextField(null=True)
bookmarks = models.ManyToManyField(User, through='Bookmark')
最后一个模型是连接MyUser
和Content
的中间模型
class Bookmark(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
content = models.ForeignKey(Content, on_delete=models.CASCADE)
created_date = models.DateTimeField(auto_now_add=True)
description = models.CharField(max_length=200, null=True)
class Meta:
unique_together = (('user', 'content'),)
ordering = ['-created_date']
def __str__(self):
return '{} bookmarked by user {}'.format(self.content, self.user)
我想使用BookmarkListAPIView
来显示某些用户的书签信息以及用户添加的内容的一些详细信息,例如title
、price
和start\u date
下面是我的序列化程序和ListAPIView
class BookmarkListView(generics.ListAPIView):
queryset = Bookmark.objects.all()
serializer_class = BookmarkSerializer
pagination_class = DefaultResultsSetPagination
def get_queryset(self):
user = self.request.user
return user.bookmark_set.all().order_by('-created_date')
class BookmarkedContentSerializer(serializers.ModelSerializer):
class Meta:
model = Content
fields = ('title', 'start_date', 'price')
class BookmarkSerializer(serializers.ModelSerializer):
content = BookmarkedContentSerializer(many=True, read_only=True)
#bookmark = BookmarkedContentSerializer(many=True, read_only=True)
class Meta:
model = Bookmark
fields = ('content', 'user')
目前,API给我的结果如下所示
class MyUser(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(unique=True)
username = models.CharField(max_length=50)
joined_date = models.DateTimeField(auto_now_add=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
facebook_id = models.CharField(max_length=50, blank=True)
is_facebook = models.BooleanField(default=False)
is_active = models.BooleanField(default=False)
class Content(models.Model):
seq = models.CharField(max_length=20, unique=True)
title = models.CharField(max_length=100, null=True)
start_date = models.DateField(null=True)
end_date = models.DateField(null=True)
place = models.TextField(null=True)
realm_name = models.TextField(null=True)
area = models.TextField(null=True)
price = models.TextField(null=True)
content = models.TextField(null=True)
ticket_url = models.TextField(null=True)
phone = models.TextField(null=True)
thumbnail = models.TextField(null=True)
bookmarks = models.ManyToManyField(User, through='Bookmark')
{
“计数”:6,
“下一个”:空,
“先前”:空,
“结果”:[
{
“内容”:8,
“用户”:4
},
{
"内容":6,,
“用户”:4
},
{
"内容":一,,
“用户”:4
},
{
"内容":二,,
“用户”:4
},
{
"内容":三,,
“用户”:4
},
{
“内容”:10,
“用户”:4
}
]
}
如上所述,我想使用contentid获取关于每个书签实例的更详细信息
看起来像
{
"count": 6,
"next": null,
"previous": null,
"results": [
{ "content_id": 4
"title": A,
"price": 10$,
"user": 4
},
{
"content_id": 6,
"title": B,
"price": 13$,
"user": 4
},
{
"content_id": 1,
"title": C,
"price": 4$,
"user": 4
},
]
}
我尝试了许多写在DRF文档中的东西,但找不到任何与我的情况相关的材料
如果你有任何想法,请帮助我 我认为您缺少的关键是每个字段的
source
关键字参数。这里有一些文档供您参考:
我认为这一实施方案应该对您有效,或者至少非常接近:
class BookmarkSerializer(serializers.ModelSerializer):
content_id = serializers.IntegerField(source='content.id')
title = serializers.CharField(source='content.title')
price = serializers.CharField(source='content.price')
user = serializers.IntegerField(source='user.id')
class Meta:
model = Bookmark
fields = ('content_id', 'user', title', 'price')
我认为您缺少的关键是每个字段的
source
关键字参数。这里有一些文档供您参考:
我认为这一实施方案应该对您有效,或者至少非常接近:
class BookmarkSerializer(serializers.ModelSerializer):
content_id = serializers.IntegerField(source='content.id')
title = serializers.CharField(source='content.title')
price = serializers.CharField(source='content.price')
user = serializers.IntegerField(source='user.id')
class Meta:
model = Bookmark
fields = ('content_id', 'user', title', 'price')
非常感谢。我看了一下,才知道这件事很简单。。但还是要谢谢你的建议!现在它工作得很好!非常感谢。我看了一下,才知道这件事很简单。。但还是要谢谢你的建议!现在它工作得很好!