2017-04-17 36 views
1

我很新的Django Django的和REST框架。我如何能实现使用中间模型嵌套的代表性?

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

我在我的项目中有3个型号,UserContent,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') 

最后一个模型,中间模型连接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 DOC很多事情,但没能找到有关我的情况的任何材料。

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

回答

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

谢谢!当我看看它时,我只知道这是一件相当简单的事情......但仍然感谢您的建议!现在它完美的工作! –

相关问题