我是Django和Django Rest Framework的新手。
我喜欢在我的项目中使用ListAPIView
显示中间模型的信息,还包括以嵌套表示形式连接到具有外键关系的中间模型的另一个模型的详细信息。
我的项目中有3个模型,User
,Content
,Bookmark
。
我的模型如下所示。
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
和{{1 }}。
下面是我的序列化程序和start_date
。
ListAPIView
目前,API为我提供了如下结果。
{ "伯爵":6, " next":null, "之前":null, "结果":[ { "内容":8, "用户":4 }, { "内容":6, "用户":4 }, { "内容":1, "用户":4 }, { "内容":2, "用户":4 }, { "内容":3, "用户":4 }, { "内容":10, "用户":4 } ] }
如上所述,我想使用内容ID来获取有关每个书签实例的更多详细信息。
看起来像
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')
我在DRF文档中尝试过很多东西,但是找不到与我的情况有关的任何材料。
如果您有任何想法,请帮助我。
答案 0 :(得分:0)
我认为您缺少的关键是每个字段的source
关键字参数。以下是一些关于它的文档:http://www.django-rest-framework.org/api-guide/fields/#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')