【问题标题】:How to query a Django queryset through a foreign key on another model?如何通过另一个模型上的外键查询 Django 查询集?
【发布时间】:2021-07-24 02:21:16
【问题描述】:

我的项目中有以下模型

class Case(models.Model):
    ...

class File(models.Model):
    class StatusType(models.TextChoices):
        ACTIVE = "ACTIVE", _("ACTIVE")
        DELETED = "DELETED", _("DELETED")

    case = models.ForeignKey(Case, on_delete=models.CASCADE, null=True)
    user = models.ForeignKey(User, null=True, on_delete=models.CASCADE)
    status = models.CharField(
        max_length=255,
        choices=StatusType.choices,
        default=StatusType.ACTIVE,
    )

基本上,在我的一个观点中,我想通过File 模型获取满足以下条件的所有情况的列表:

  • user = request.user
  • status = "ACTIVE"

我怎样才能以简单的方式做到这一点?我可以先查询所有文件,然后遍历它们并将案例添加到列表中。这是解决这个问题的最佳方法吗?

提前感谢您的帮助。

【问题讨论】:

  • 在过滤器中使用双下划线,例如user__username='fred'
  • 查看 Django 文档中的 Making queries 页面

标签: django django-models django-queryset


【解决方案1】:

试试这个:

@login_required
def my_view(request):
    active_file = File.objects.filter(status=StatusType.ACTIVE, user=request.user)

    cases = Case.objects.filter(file__in=active_file)

    context = {'case': cases}

    return render(request, 'test.html', context=context)

【讨论】:

  • 或者只是cases = Case.objects.filter(file__in=active_file)
  • @bdbd 你使用in 然后它期望值作为列表
  • active_file 是一个“类似列表”的查询集
【解决方案2】:

另一种与@anamul 的回答相同的方法

Case.objects.filter(
    file__user=request.user.id, 
    file__status=StatusType.ACTIVE,
)

您没有从File 指定案例FK 的相关名称,因此此处的file__ 可能需要更改为file_set__

【讨论】:

    猜你喜欢
    • 2018-12-04
    • 2020-05-10
    • 2011-05-16
    • 1970-01-01
    • 2014-01-08
    • 2015-10-14
    • 2015-03-09
    • 2015-04-20
    • 2017-12-30
    相关资源
    最近更新 更多