2017-04-17 37 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

謝謝!當我看看它時,我只知道這是一件相當簡單的事情......但仍然感謝您的建議!現在它完美的工作! –

相關問題