Django,检测object.filter是不是返回0个对象

Posted

技术标签:

【中文标题】Django,检测object.filter是不是返回0个对象【英文标题】:Django, detect if object.filter returns 0 objectsDjango,检测object.filter是否返回0个对象 【发布时间】:2020-05-21 06:38:28 【问题描述】:

我得到了这样的表结构

class Item(models.Model):
    id = models.AutoField(primary_key=True)

class Car(models.Model):
    vin_number = models.CharField(max_length=250, null=True, blank=True)
    item = models.OneToOneField(Item, on_delete=models.CASCADE)
    name = models.CharField(max_length=1000, null=True)
    year = models.IntegerField(null=True)

class Yacht(models.Model):
    name = models.CharField(max_length=1000, default='')
    boat_type = models.CharField(max_length=1000, default='', null=True)
    item = models.OneToOneField(Item, on_delete=models.CASCADE)
    description = models.TextField(default='')
    year = models.IntegerField(null=False, default=0)

所以,Car 和 Yacht 都与 Item 表有关系

如果我在请求中只有项目 ID,那么编写此类查询的正确方法是什么

    data = request.POST
    item = Car.objects.filter(item_id=data['item_id']).first()
    if not item:
        item = Yacht.objects.filter(item_id=data['item_id']).first()

有什么办法不使用 if/else 语句?

【问题讨论】:

你能提供更多细节吗? if not item: 不工作吗? @Hisham___Pak - 为什么if not item 不起作用? 我在问你有什么问题。 @Hisham___Pak - 问题是我需要对汽车和游艇进行 2 次查询。如果我有更多与ItemOneToOne 关系的表? 【参考方案1】:

您无需查看 Car 和 Yacht 模型。直接使用Item模型的OneToOne关系

item = Item.objects.filter(id = data['id']).first

此项目具有与其他模型之一相关的特定 ID。您可以使用

访问它们
if item.car:
   car = item.car
else:
   yacht = item.yacht

但我想您还需要将 related_name='tags',related_query_name='tag' 添加到汽车和游艇的 OneToOne 字段中。 我建议您检查一下https://kite.com/python/docs/django.db.models.ForeignKey。

更多详情请至https://docs.djangoproject.com/en/3.0/topics/db/examples/one_to_one/

【讨论】:

【参考方案2】:

您需要使用exists()

Car.objects.filter(item_id=data['item_id']).exists()
Yacht.objects.filter(item_id=data['item_id']).exists()

它会返回TrueFalse。 官方链接docs。

【讨论】:

但是我仍然需要使用if/else 来检查第一个查询的结果 我认为您使用的数据库结构不好。我会像在模型中那样按类型分隔项目,并在每个模型中添加 id 字段,因为我没有看到单独的 Item 模型有任何优点。

以上是关于Django,检测object.filter是不是返回0个对象的主要内容,如果未能解决你的问题,请参考以下文章

Django 寻找我可以在 object.filter 中使用的变量

Django filter中contains 用法

django - 如何检测测试环境(检查/确定是不是正在运行测试)

django表如何检测表是不是为空

Django 是不是有模板标签可以检测 URL 并将其转换为超链接?

它可能检测用户是不是在 django 后端使用 pwa