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

时间:2017-04-17 22:50:32

标签: django django-rest-framework

我是Django和Django Rest Framework的新手。

我喜欢在我的项目中使用ListAPIView显示中间模型的信息,还包括以嵌套表示形式连接到具有外键关系的中间模型的另一个模型的详细信息。

我的项目中有3个模型,UserContentBookmark

我的模型如下所示。

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')

最后一个模型,一个连接MyUserContent的中间模型。

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来显示某些用户的书签信息以及用户添加的内容的一些详细信息,例如titleprice和{{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文档中尝试过很多东西,但是找不到与我的情况有关的任何材料。

如果您有任何想法,请帮助我。

1 个答案:

答案 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')