Django 如何使用中间模型实现嵌套表示?

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

我对Django和Django Rest框架非常陌生

在我的项目中,我喜欢使用
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')

非常感谢。我看了一下,才知道这件事很简单。。但还是要谢谢你的建议!现在它工作得很好!非常感谢。我看了一下,才知道这件事很简单。。但还是要谢谢你的建议!现在它工作得很好!