【问题标题】:Django Rest how to get multiple objects with lookup_field [closed]Django Rest如何使用lookup_field获取多个对象[关闭]
【发布时间】:2020-10-16 01:10:57
【问题描述】:

我想为我的 api 创建简单的过滤。我想在我的网址中搜索的是: /api/videoquestionset/2/

并根据开发人员的要求,获取视频字段为 2 或任何其他数字的每个 videoquestion 对象。

我现在得到的错误是: get() returned more than one VideoQuestions -- it returned 2!

这是我的代码:

models.py

    class Questions(models.Model):
    """
        Questions class for the e-learner overlay
    """
    question_text = models.CharField(max_length=150)
    answer = models.OneToOneField(QuestionAnswers, on_delete=models.CASCADE,
                                  related_name='correct_answer', null=True, blank=True)
    choices = models.ManyToManyField(QuestionAnswers, related_name='choices')

    class Meta:
        verbose_name_plural = "Questions"


class VideoQuestions(models.Model):
    """
        Categorize questions per video
    """
    video = models.ForeignKey(Video, on_delete=models.CASCADE)
    created = models.DateTimeField()
    question = models.ManyToManyField(Questions, blank=True, related_name='question')

    class Meta:
        verbose_name_plural = "learner questions"

views.py:

class VideoQuestionSet(viewsets.ModelViewSet):
    serializer_class = VideoQuestionSerializer
    queryset = VideoQuestions.objects.all()
    lookup_field = 'video'

    # def get_queryset(self):
    #     queryset = VideoQuestions.objects.all()
    #     video = self.request.query_params.get('video', None)
    #     if video is not None:
    #         queryset = queryset.filter(video=video)
    #     return queryset

我的 urls.py:

from django.conf.urls import include, url
from rest_framework import routers

from .views import VideoQuestionsListView, VideoQuestionSet



router = routers.DefaultRouter()
router.register(r'videoquestions', VideoQuestionsListView, basename='vq-list'),
router.register(r'videoquestionset', VideoQuestionSet, basename='vq-detail'),


urlpatterns = [
    url(r'', include(router.urls))
]

我尝试了什么:

  • Django 使用正则表达式进行过滤,例如 /videoquestionset/?v=2。我实在想不通过滤掉,所以我恢复到我的旧代码。

【问题讨论】:

    标签: python-3.x django api django-rest-framework django-views


    【解决方案1】:

    在您的情况下,我更喜欢 URL 过滤(您已经拥有)。

    class VideoQuestionSet(viewsets.ModelViewSet):
        serializer_class = VideoQuestionSerializer
    
        def get_queryset(self):
            queryset = VideoQuestions.objects.all()
            video = self.request.query_params.get('video', None)
            if video:
                queryset = queryset.filter(video_id=int(video))
            return queryset

    请注意,从您的视图中移除 lookup_field 以及 queryset 属性。

    新视图中,我们正在寻找一个名为 video 的 URL 查询参数。因此,在过滤结果时,您的 URL 必须为

    /videoquestionset/<b>?video=2</b>

    简而言之,您的方法是正确的,但是您尝试了错误的 URL。

    【讨论】:

    • 哇,这么简单,真的让我很烦。因为这个,我正在拉扯我的头发。非常感谢楼主!
    猜你喜欢
    • 2021-05-23
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 2013-09-01
    • 2018-04-16
    • 2020-04-14
    相关资源
    最近更新 更多