2017-09-04 42 views
0
class Categorie(models.Model): 
    name = models.CharField(max_length=200) 
    description = models.TextField(max_length=2000) 
    status = models.BooleanField(default=True) 
    added_date = models.DateTimeField(auto_now_add=True) 

    def __unicode__(self): 
    return u'%s' % self.name 


class GroupQuestion(models.Model): 
    category = models.ForeignKey(Categorie, related_name='%(class)s_name_related', null=True) 
    name = models.CharField(max_length=200) 
    added_date = models.DateTimeField(auto_now_add=True) 
    status = models.BooleanField(default=True) 

    class Meta: 
     verbose_name = 'Group of Questions' 
     verbose_name_plural = 'Group of Questions' 

    def __unicode__(self): 
     return u'%s' % self.name 


class Question(models.Model): 
    category = models.ForeignKey(Categorie, related_name='%(class)s_name_related', null=True) 
    group = models.ForeignKey(GroupQuestion, related_name='%(class)s_name_related') 
    name = models.TextField(max_length=200) 
    added_date = models.DateTimeField(auto_now_add=True) 
    status = models.BooleanField(default=True) 
    #select_choice = models.CharField(max_length=5, choices=QUESTION_CHOICES, null=True) 
    positive_answer = models.PositiveIntegerField() 
    negative_answer = models.PositiveIntegerField() 

    def __unicode__(self): 
     return u'%s' % self.name 

我有這三種模式。當我通過我的API傳遞category_id想要獲得與該組相關的QuestionGroups和問題?如何用外鍵關係在模型中編寫查詢?

一些這樣的事

「數據」:[ { ID:1個 名稱= ABC 「問題」:[ { 「ID」:1 「名稱」:ABC } { 「ID」:1 「名稱」:ABC } ] } { ID:1個 名稱= ABC 「問題」: { 「ID」:1 「名」:ABC } { 「ID」:1 「名」:ABC } ] } }

我django中的新增功能有些可以幫助我如何編寫查詢以及如何序列化數據。

回答

0

您正在查找nested serialization


您應該創建兩個序列化器。一個爲您的GroupQuestion型號,另一個爲您的Question型號。您將使用您的QuestionSerializer裏面的您的GroupQuestionSerializer爲了執行嵌套序列化

在你serializers.py

from rest_framework import serializers 

from .models import GroupQuestion, Question 


# Serializer for the Question model 
class QuestionSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Question 
     fields = ('id', 'name') 


# Serializer for the GroupQuestion model 
class GroupQuestionSerializer(serializers.ModelSerializer): 
    question_name_related = QuestionSerializer(read_only=True, many=True) 
    # The magic happens here^
    # You use your QuestionSerializer inside your GroupQuestionSerializer 
    # In order to serialize the related Questions for this GroupQuestion 

    class Meta: 
     model = GroupQuestion 
     fields = ('id', 'question_name_related') 

然後讓我們說你有一個簡單ListAPIView上市的GroupQuestion條目。

在你views.py

from rest_framework import generics 

from .models import GroupQuestion 
from .serializers import GroupQuestionSerializer 
# Import the serializer that we have just created 


class GroupQuestionList(generics.ListAPIView): 
    serializer_class = GroupQuestionSerializer 

    def get_queryset(self): 
     category_id = self.kwargs['category_id'] 
     category = generics.get_object_or_404(Categorie, id=category_id) 

     return GroupQuestion.objects.filter(category=category) 

這種看法只會序列化所有GroupQuestion車型,已經給定id相關Categorie


最後,將這個視圖映射到你的URL中,當你訪問這個端點時,你應該得到預期的結果。

在你urls.py

from django.conf.urls import url 

from . import views 

urlpatterns = [ 
    url(r'^groups/(?P<category_id>[0-9]+)/$', views.GroupQuestionList.as_view(), name='group_question_list') 
] 

:我不知道,question_name_related對於Question模型有效related_nameGroupQuestion

+0

謝謝@wencakisa –