【问题标题】:Django, queryset filter ManyToManyFieldDjango,查询集过滤器ManyToManyField
【发布时间】:2014-06-12 09:31:47
【问题描述】:

我确实有以下两种型号。所以我正在尝试获取特定课程的所有模块。正如你所看到的,我已经得到了那个特定的课程。所以我只需要从中获取 modules 。我阅读了the docs 关于过滤 ManyToManyField 的内容,但仍然无法使其工作。我知道可能是太简单了但是解决不了。

models.py

class Course(models.Model):
    name = models.CharField(max_length=100)
    modules = models.ManyToManyField('Module', blank=True)

class Module(models.Model):
    code = models.CharField(max_length=10, unique=True)
    name = models.CharField(max_length=65)
    year = models.IntegerField()

view.py

def ajax_get_modules(request, course):
    current_course = Course.objects.get(pk=course).pk
    modules = Module.objects.filter(...........)
    if request.is_ajax():
        data = serializers.serialize('json', modules)
        return HttpResponse(data, content_type="application/javascript")

【问题讨论】:

    标签: python django filter django-orm


    【解决方案1】:

    试试:

    current_course = Course.objects.get(pk=course)
    modules = Module.objects.all().filter(course=current_course)
    

    【讨论】:

    【解决方案2】:

    您在课程模型上有一个相关字段,它是 M2M 到模块,因此您可以访问与课程直接关联的模块列表。

    一旦你有了课程,只需像这样获取它的所有模块:

    course = Course.objects.get(pk=course_id)
    course_modules = course.modules.all()
    

    我总是建议用 try/except 包装查询 Course 的第一行 - 这是因为如果找不到结果,模型管理器的 get 方法可能会抛出异常。

    可以这样做:

    try:
        course = Course.objects.get(pk=course_id)
    except Course.DoesNotExist:
        pass  # Handle this exception
    

    【讨论】:

      【解决方案3】:
      #models.py
      class Telephone(models.Model):
          status                = models.IntegerField(default=0)
          number                = models.CharField(max_length=255, blank=True)
      
      class Profile(models.Model):
          first_name            = models.CharField(max_length=255, blank=True)
          last_name             = models.CharField(max_length=255, blank=True)
          telephone             = models.ManyToManyField(Telephone, blank=True, null=True)
      
      #views.py
      def api(request):
          profile = Profile.objects.get(pk=1) #just as an example
          primary_telephone     = profile.telephone.all().filter(status=1)
      
      #I was looking for the primary telephone of my client, this was the way I have solved.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-30
        • 1970-01-01
        • 2018-09-23
        • 2019-07-29
        • 1970-01-01
        • 2020-02-01
        • 1970-01-01
        • 2020-08-22
        相关资源
        最近更新 更多