2017-09-17 63 views
1

我有這些模型,其中一本書可以有不同的語言的內容很多:Django的REST框架 - 獲取相關對象

class Book(models.Model): 
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 
    title = models.CharField(max_length=255) 

class BookContent(models.Model): 
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 
    book = models.ForeignKey(Book, on_delete=models.CASCADE) 
    content = models.TextField() 
    language = models.TextField() 

----------------- ---更新--------------------

我該如何獲取Book及其相關的BookContent,使得結果JSON如下所示?

{ 
    "results": [ 
     { 
      "id": "d3e5185a-1b7b-427c-bbe3-030bfa2e3bce", 
      "title": "My Book Title",    
      "book_content": [ 
       { 
        "id": "0fea8027-3ecf-4571-a95f-5a09a93408ec", 
        "content": "hello content 1", 
        "language": "english" 
       }, 
       { 
        "id": "0fea8027-3ecf-4571-a95f-5a09a93408ed", 
        "content": "你好", 
        "language": "chinese" 
       } 
      ] 
     } 
    ] 
} 

回答

1

你需要編寫一個查詢類似

take a look at doc參考

query = BookContent.objects.filter(book=book_id)# this will give 
 
you a queryset with all the book content records with that particular book_id

+0

謝謝。但我如何獲取Book對象呢? – nuttynibbles

+0

要獲得一個單一的對象,你可以使用get()等。 Book.objects.get(id = book_id) –

1

你需要獲得particular book的所有內容與給定bookidbooktitle不管你已在url中使用。

bookcontents = BookContent.objects.filter(book__id=bookid) 

如果你已經使用在urlbooktitle即可。

bookcontents = BookContent.objects.filter(book__title=booktitle) 

現在,在HTML

{% for cont in bookcontents %} 
    <h1>{{bookcontent.book.title}}</h1> 
    <b>{{bookcontent.language}}</b> 
    <p>{{bookcontent.content}}</p> 
{% endfor %} 

如果只有書的對象是已知的。

book = get_object_or_404(Book, id=bookid) 

現在,在HTML

{% for cont in book.bookcontent.all %} 
    <h1>{{cont.book.title}}</h1> 
    <b>{{cont.language}}</b> 
    <p>{{cont.content}}</p> 
{% endfor %} 
+0

嗨,謝謝。但是,我如何通過Book對象獲取呢? – nuttynibbles

+0

等待我更新答案。 –

+0

@nuttynibbles,我已經更新了我的答案現在看看。 –

1

models.py
在BookContent,添加related_name到FOREIGNKEY書

class Book(models.Model): 
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 
    title = models.CharField(max_length=255) 

class BookContent(models.Model): 
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 
    book = models.ForeignKey(Book, on_delete=models.CASCADE, related_name='content') 
    content = models.TextField() 
    language = models.TextField() 

serializers.py
參考here更多信息

class BookContentSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = BookContent 
     fields = ('id', 'content', 'language') 

class BookSerializer(serializers.ModelSerializer): 
    content = BookContentSerializer(many=True, read_only=True) 

    class Meta: 
     model = Book 
     fields = ('id', 'title', 'content') 

結果:

{ 
    "results": [ 
     { 
      "id": "d3e5185a-1b7b-427c-bbe3-030bfa2e3bce", 
      "title": "My Book Title",    
      "book_content": [ 
       { 
        "id": "0fea8027-3ecf-4571-a95f-5a09a93408ec", 
        "content": "hello content 1", 
        "language": "english" 
       }, 
       { 
        "id": "0fea8027-3ecf-4571-a95f-5a09a93408ed", 
        "content": "你好", 
        "language": "chinese" 
       } 
      ] 
     } 
    ] 
}