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 次查询。如果我有更多与Item
有OneToOne
关系的表?
【参考方案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()
它会返回True
或False
。
官方链接docs。
【讨论】:
但是我仍然需要使用if/else
来检查第一个查询的结果
我认为您使用的数据库结构不好。我会像在模型中那样按类型分隔项目,并在每个模型中添加 id 字段,因为我没有看到单独的 Item
模型有任何优点。以上是关于Django,检测object.filter是不是返回0个对象的主要内容,如果未能解决你的问题,请参考以下文章
Django 寻找我可以在 object.filter 中使用的变量
django - 如何检测测试环境(检查/确定是不是正在运行测试)