【问题标题】:How to get two querysets in List View如何在列表视图中获取两个查询集
【发布时间】:2019-06-24 20:06:52
【问题描述】:

我有 2 个扩展基本问题模型的问题模型:

class Question(models.Model):
    title = models.CharField(blank=False, max_length=200)
    order = models.PositiveIntegerField(default = 0)
    is_actuve = models.BooleanField(default = False)

class OptionQuestion(Question):
    is_bulletpoint = models.BooleanField(default=False)
    has_others = models.BooleanField(default=False)
    has_context = models.BooleanField(default=False)
    options = ArrayField(models.CharField(max_length=100), verbose_name='گزینه‌ها')


class ItemQuestion(Question):
    pass

我最初有 Question 类摘要,但我需要一个唯一的 ID 跨越所有问题,现在我需要一个 ListAPIView 为他们两个。 我有 2 个序列化程序分别用于 OptionQuestionItemQuestion。 我只需要实现一个视图来处理对问题列表的请求并使用适当的序列化程序处理它们。

class QuestionListView(ListAPIView):
    serializer_class_OptionQuestion = OptionQuestionSerializer
    serializer_class_ItemQuestion = ItemQuestionSerializer

    def get_queryset_OptionQuestion(self):
        #???

【问题讨论】:

  • 有时基于类的通用视图很棒,但有时您必须求助于构建自己的视图。它认为这里就是这种情况。 ListAPIView 不是为两个列表制作的,因此您应该构建自己的视图来返回正确的 JSON。退后一步,改用通用的APIView 并实现自己的get() 方法。
  • 或者你可以看看django-polymorphic
  • @dirkgroten 谢谢我会这样做
  • @gpichot 我真的很喜欢它并且会使用它,但是当我昨天对我的主管这么说时,他不同意说它可能会降低性能。
  • 您可以在需要时使用this trick 自动获取相关子类。或者使用InheritanceManager,它在请求时执行完全相同的操作,并且不会改变正常行为,即没有性能问题。您可以在 ListApiViewget_queryset() 方法中使用它。

标签: django django-models django-rest-framework


【解决方案1】:

你可以试试这个

class QuestionListView(ListAPIView):
   serializer_class_OptionQuestion = OptionQuestionSerializer
   serializer_class_ItemQuestion = ItemQuestionSerializer

   def get(self, request, *args, **kwrgs):
      if request.method == 'GET':
          query1 = Question.objects.all()
          query2 = OptionQuestion.objects.all()

          seralizer1 = self.serializer_class_OptionQuestion(query1)
          seralizer2 = self.serializer_class_ItemQuestion(query2)

          return Response(
             {
               'data1':seralizer1.data,
               'data2':seralizer2.data,
             }
          )

希望它能解决您的问题

【讨论】:

    猜你喜欢
    • 2018-07-30
    • 2011-08-22
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 2022-01-15
    • 1970-01-01
    相关资源
    最近更新 更多