【问题标题】:How to deal with empty foreign keys in a for loop within django View如何在 django View 的 for 循环中处理空外键
【发布时间】:2021-10-20 18:10:11
【问题描述】:

我有一个模型作为时间表,其中与同一个用户表有多个 FK 关系。所有这些字段都可以为空/null。

问题是,当我执行 for 循环时,我试图根据用户出现在某个班次上的时间来匹配他们,然后将 +1 添加到计数器以获取该用户的总班次。

模型如下所示:

class WeekdayAssignment(models.Model):
    """Model definition for WeekdayAssignment."""

    start_date = models.DateField(auto_now=False, auto_now_add=False)
    end_date = models.DateField(auto_now=False, auto_now_add=False)
    triage_emea_1 = models.ForeignKey(TeamMember, on_delete=models.DO_NOTHING, related_name="triage_emea_1", blank=True, null=True)
    triage_nam_1 = models.ForeignKey(TeamMember, on_delete=models.DO_NOTHING, related_name="triage_nam_1", blank=True, null=True)
    triage_nam_2 = models.ForeignKey(TeamMember, on_delete=models.DO_NOTHING, related_name="triage_nam_2", blank=True, null=True)
    triage_nam_3 = models.ForeignKey(TeamMember, on_delete=models.DO_NOTHING, related_name="triage_nam_3", blank=True, null=True)
    ...

如您所见,我有 4 个分诊班次,同一用户可以工作任何班次。

我想做一个 for 循环来计算用户在任何一个字段中轮班的次数。

在不深入了解我正在做的所有细节的情况下,我会保持简单,因为错误会立即发生。

Views.py

def someview(request):
    shift_users = TeamMember.objects.all()
    weekday_shifts = WeekdayAssignment.objects.all()
    for t in shift_users:
        for ws in weekday_shifts:
            print(ws.triage_nam_3)

只要字段中有值,就会正常打印,但如果字段为空(即没有为该字段选择用户),则会失败并显示TeamMember matching query does not exist.

我尝试检查是否为 None,但它给出了同样的问题。现在,一旦我填充了一个用户,这个错误就会消失,但是我如何检查它是否为空并跳过它?

提前致谢。

【问题讨论】:

    标签: python django django-views django-queryset django-orm


    【解决方案1】:

    您可以捕获models.DoesNotExist 异常。

    def someview(request):
        shift_users = TeamMember.objects.all()
        weekday_shifts = WeekdayAssignment.objects.all()
        for t in shift_users:
            for ws in weekday_shifts:
                try:
                    print(ws.triage_nam_3)
                except TeamMember.DoesNotExist:
                    continue
    

    【讨论】:

    • 太棒了!我知道这将是我所缺少但显而易见的东西。非常感谢!
    • 感谢您的支持和接受帮助我赢得了 1k 的声誉。
    猜你喜欢
    • 2013-12-18
    • 2016-10-21
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多