【问题标题】:How can I implement a nested representation using intermediate model?如何使用中间模型实现嵌套表示?
【发布时间】:2017-04-17 22:50:32
【问题描述】:

我对 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来显示某些用户的书签信息和用户添加的内容的一些详细信息,例如titlepricestart_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 给我的结果如下所示。

{ “计数”:6, “下一个”:空, “上一个”:空, “结果”: [ { “内容”:8, “用户”:4 }, { “内容”:6, “用户”:4 }, { “内容”:1, “用户”:4 }, { “内容”:2, “用户”:4 }, { “内容”:3, “用户”:4 }, { “内容”:10, “用户”:4 } ] }

如上所述,我想使用内容 ID 来获取有关每个书签实例的更详细信息。

看起来像

{
  "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 文档中写的很多东西,但找不到与我的情况相关的任何材料。

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

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    我认为您缺少的关键是每个字段的 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')
    

    【讨论】:

    • 谢谢!当我看它时,我才知道这是一件很简单的事情..但仍然感谢您的建议!现在完美运行!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    • 2022-01-07
    • 2018-11-07
    相关资源
    最近更新 更多