Django:检查相关对象以及它是否包含数据

时间:2014-04-17 06:14:16

标签: python django

例如,我在汽车管理系统(网页)中有两个型号:

    class Brand(models.Model):
        brand_name= models.CharField(max_length=100, null=False)

    class Cars(models.Model):
        car_model= models.CharField(max_length=100, null=False)
        car_production_year= models.CharField(max_length=100, null=False)
        car_brand= models.ForeignKey(Brand, null=True, blank=True, default = None)

现在,我想从汽车系统中删除品牌数据。如何检查此品牌是否已在其他模型中使用或该外键是否包含任何数据(因为我已在Cars模型中为car_brand允许为null)。

PS: 使用此功能:

self.model._meta.get_all_related_objects():

我在Brand模型类中使用了任何相关对象。但是,如果相关对象包含任何数据,我不知道如何获取。

4 个答案:

答案 0 :(得分:8)

使用exists()。它被设计用于这种情况:

for brand in Brand.objects.all():
    if not brand.cars_set.all().exists():
        # delete

此外,它几乎总是比任何其他类型的检查更快,因为它的设计方式适用于数据库级别。您可以在docs

中查看exists()行为的详细信息

答案 1 :(得分:2)

this question开始,对于我的代码,这更快:

for b in Brand.objects.filter(cars__isnull=True):
    # delete

如果您有ids(我的情况),我使用了它(比cars_set快60%):

for brand_id in brand_id_set:
    if Brand.objects.filter(id=brand_id).filter(cars__isnull=True):
        # delete

我正在使用Django 1.11

答案 2 :(得分:1)

我认为最简单的方法是这样的:

# brand is an instance of Brand

if not brand.cars_set.all():
    # delete
else:
    # do something else

Django docs涵盖了非常详细的外键。

答案 3 :(得分:0)

cars_with_brands = Car.objects.filter(car_brand__isnull = False)
if cars_with_brands.count() == 0:
    # you can delete Brand Model
else:
   cars_with_brands.delete()
   # you can delete Brand Model