如何获得延期的属性值?

时间:2019-04-25 03:22:34

标签: python django

我需要比较两个ID值以查看它们是否匹配。在此数据库中,有区域和位置。我需要检查哪些位置在特定区域内。区域具有ID作为主键,位置中具有指向区域的外键。

    if obj.area.id == self.id:

由于某种原因,外键始终返回正确的值,而self.id(在Area类中)始终返回<django.db.models.query_utils.DeferredAttribute object at 0x03506B70>。我已经尝试过Area.id,Area.pk,Area._get_pk_val以及所有使用self而不是Area的东西。如何从延迟属性中提取值?

    class Area(models.Model):
        id = models.IntegerField(default=0, primary_key=True)
        name = models.CharField(max_length=30)
        longitude = models.FloatField(default=0)
        latitude = models.FloatField(default=0)

        def __str__(self):
            return self.name

        def number_of_locations(self):
            count=0
            measurements.objects
            for obj in Location.objects.all():
                print (str(obj.area.id)+" vs "+str(self.id))
                if obj.area.id == self.id:
                    print("check")
                    count+=1
            return count

编辑:终于使它工作了。现在,它检查所有区域,而不是当前所在的区域,并返回所有位置数量的数组。这不是我最初打算的,但可以使用。

        def number_of_locations(self):
        count_array = []
        count=0
        for a in Area.objects.all():
            for obj in Location.objects.all():
                #print (str(obj.area.id)+" vs "+str(a.id))
                if obj.area.id == a.id:
                    print("check")
                    count+=1
            count_array.append(count)
            count=0
        return count_array

1 个答案:

答案 0 :(得分:0)

您可以通过exists()进行检查。如果该项目存在于模型中,它将返回true 试试这个

def number_of_locations(self):
    count = 0
    for obj in Location.objects.all():
        print(str(obj.area.id) + " vs " + str(self.id))
        if obj.area.id == Area.objects.filter(pk=obj.area.id).values_list('pk', flat=True).first():
            print("check")
            count += 1
    return count