2015-07-19 94 views
3

你好盖伊我是Django的新手。我使用Django的Rest API与我的android应用程序进行交互。 我有我需要的数据在可变任务。由于我有很多问题使用过滤器而不是get。Django序列化返回一个空列表

这是我Views.py:

class MapertablesViewSet(viewsets.ModelViewSet): 
    """ 
    API endpoint that allows groups to be viewed or edited. 
    """ 
    queryset = Mapertables.objects.all() 
    serializer_class = MapertablesSerializer 
    lookup_field = 'category_id' 

    def get_queryset(self): 
     #print self.kwargs['category_id'] 
     maps = Mapertables.objects.filter(category_id=self.kwargs['category_id']) 
     #queryset = list(maps) 
     #queryset = serializers.serialize('json',maps) 
     #print "AAAA ",queryset 
     i = 0 
     #quest ={} 
     queryset = [] 
     queslist = [] 
     for question in maps: 
      quest = {} 
      quest['question'] = question.question_id 
      #print 'qqqq ',question.question_id 
      #queryset = serializers.serialize('json',[question,]) 
      choices = Choice.objects.filter(question=question.question_id) 
      print choices 
      #aaa = chain(question,choices) 
      #print aaa 
      #queryset = serializers.serialize('json',[question,choices,]) 
      j = 0 
      for option in choices: 
       quest[j] = option.choice_text 
       j += 1 
      print 'data Here ',quest 
      #data Here {0: u'Highbury', 1: u'Selhurst Park', 2: u'The Dell', 3: u'Old Trafford', 'question': <Question: At which ground did Eric Cantona commit his "Kung Fu" kick ?>} 
      serializer_class = CoustomeSerializer(queryset, many=True) 
      print serializer_class.data 
      #[] 
      json = JSONRenderer().render(serializer_class.data) 
      print 'JSON',json 
      #[] 
      i += 1 

     queryset = queslist 
     serializer_class = CoustomeSerializer(queryset,many=True) 
     return queryset 
     #print "questions",queslist 
     #print "Ser ",ser.data 

这是我的serializers.py:被定义显示

class MapertablesSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Mapertables 
     fields = ('question_id','category_id') 


class CoustomeSerializer(serializers.HyperlinkedModelSerializer): 
    #questions = MapertablesSerializer(source='question_id') 
    #choices = ChoiceSerializer(source='choice_text') 
    class Meta: 
     model = Question,Choice,Category 
     fields = ('choice_text','choice_text','choice_text','choice_text','question_id') 

网址: http://127.0.0.1:8000/mapers/ 异常类型:KeyError异常 异常值: 'category_id'

当我查询它返回的特定类别时: http://127.0.0.1:8000/mapers/2/ { “detail”:“Not found。” }

Model.py文件如下:

from django.db import models 

# Create your models here. 
class Category(models.Model): 
    category_name = models.CharField(max_length=200,default='1') 
    def __str__(self): 
     return self.category_name 


class Question(models.Model): 
    question_text = models.CharField(max_length=200) 
    #category_name = models.ForeignKey(Category) 
    pub_date = models.DateTimeField('date published') 
    def was_published_recently(self): 
     return self.pub_date >= timezone.now() - datetime.timedelta(days=1) 
    was_published_recently.admin_order_field = 'pub_date' 
    was_published_recently.boolean = True 
    was_published_recently.short_description = 'Published recently?' 
    def __str__(self): 
     return self.question_text 


class Mapertables(models.Model): 
    category_id = models.ForeignKey(Category) 
    question_id = models.ForeignKey(Question) 


class Choice(models.Model): 
    question = models.ForeignKey(Question) 
    choice_text = models.CharField(max_length=200) 
    votes = models.IntegerField(default=0) 
    def __str__(self): 
     return self.choice_text 

我希望得到有关类别的所有问题,并有选择形成的选择模块,为什么在get_queryset所有的东西。

请告诉我怎么走都在MapertablesViewSet类我需要

预先感谢您的数据,如果你要我送完整的项目只是让我知道,我会做拉链,并将其上传到开车什么的。

+0

你看到quest和serializer_class的输出,这是代码打破。 –

回答

1

@Kevin布朗是正确的,你不应该担心串行,或呈现的get_queryset方法什么,但我在你的get_queryset方法注意到的事情是,你没有任何项目追加到列表queryset,和querylist。我下面给你一个想法:

def get_queryset(self): 
     #print self.kwargs['category_id'] 
     maps = Mapertables.objects.filter(category_id=self.kwargs['category_id']) 
     i = 0 
     queryset = [] 
     for question in maps: 
      quest = {} 
      quest['question'] = question.question_id 
      choices = Choice.objects.filter(question=question.question_id) 
      print choices 

      j = 0 
      for option in choices: 
       quest[j] = option.choice_text 
       j += 1 
      print 'data Here ',quest 
      # Adding items to queryset list 
      queryset.append(quest) 
      i += 1 

     # You should have values here on queryset list 
     print queryset 

     return queryset 

至于URL,确保你传递category_id为URL模式的参数。就像url(r'^mapers/(?P<category_id>\d+)/?',如果你不使用routers这个。如果你在这里粘贴你的URL定义将会很好。那么,我希望它能帮助你更好地了解如何继续。

0

您正在返回get_queryset方法中的空列表,因此在列表视图中没有返回对象,并且pk也无法检索到特定的对象。

你似乎在你的get_queryset方法中做了很多不相干的事情,他们可能是造成这个问题的原因。你不应该在那里做任何序列化,DRF将在稍后为你处理。你应该在filter_queryset方法中进行筛选,或者将它传递给DRF来完成。您也无法返回来自该方法的任何响应,仅返回一个查询集。

+0

谢谢你的时间。 get_queryset中的内容是获取所有类别的数据库。我采取类别id并检索问题。获取问题的选择。有没有一个简单的方法来做到这一点。如果有的话请提出建议真的谢谢你..而且我还会研究filter_queryset –