【问题标题】: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 关系的表?

标签: django orm


【解决方案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 模型有任何优点。
    猜你喜欢
    • 1970-01-01
    • 2020-06-15
    • 2022-10-14
    • 2016-09-05
    • 2020-01-22
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多