Python Django';s选择\u相关-筛选引用的引用
我试图使用Django的select_related进行查询,该查询将遍历两个独立的模型 条件如下所示(注意,值是一个重命名-它不是与值相关的语法): 数据模型如下所示:Python Django';s选择\u相关-筛选引用的引用,python,django,Python,Django,我试图使用Django的select_related进行查询,该查询将遍历两个独立的模型 条件如下所示(注意,值是一个重命名-它不是与值相关的语法): 数据模型如下所示: class valueResults(models.Model): value_id = models.ForeignKey(value) result_date = EncryptedDateTimeField() status_code = EncryptedCharField(max_length
class valueResults(models.Model):
value_id = models.ForeignKey(value)
result_date = EncryptedDateTimeField()
status_code = EncryptedCharField(max_length=25)
value = EncryptedIntegerField()
test_started = EncryptedDateTimeField()
class value(models.Model):
value_id = EncryptedCharField(primary_key=True, unique=True, max_length=100)
valuetype_id = models.ForeignKey(valueType)
dateitemord = EncryptedDateTimeField()
status = EncryptedCharField(max_length=100)
item_id = models.ForeignKey(Items)
user_id = models.ForeignKey(User)
class Items(models.Model):
item_id = models.CharField(primary_key=True,max_length=100)
mailed_date = EncryptedDateTimeField()
received_date = EncryptedDateTimeField()
last_viewed = EncryptedDateTimeField()
dateitemsent = EncryptedDateTimeField()
itemidvalue = EncryptedCharField(max_length=100)
itemsent = EncryptedCharField(max_length=25)
itemret = EncryptedCharField(max_length=25)
dateitemret = EncryptedDateTimeField()
status = EncryptedCharField(max_length=25)
我的理想目标是根据valueResults模型的状态代码和项目id进行过滤。这可能吗?选择相关的是一种性能调优工具,与存在性测试无关。它不会改变什么样的查询是可能的。可以使用
符号对外键关系进行过滤-有关示例,请参阅。例如,从valueResults
模型到value
到项目的链接:
if valueResults.objects.filter(value_id__item_id__status="yes", value_id__item_id__item_id=item_id).exists():
# do something
select_related:返回将“遵循”外键关系的查询集,在执行查询时选择其他相关对象数据。这是一个性能提升器,它会导致单个更复杂的查询,但意味着以后使用外键关系将不需要数据库查询。exists():如果QuerySet包含任何结果,则返回True,否则返回False。这将尝试以尽可能最简单和最快的方式执行查询,但它执行的查询与普通QuerySet查询几乎相同。据我所知,由于select_related返回一个查询集,我应该能够对其执行exists()。在exists
查询中使用select_related
在语义上并不错误,它只是没有用。基本上,select\u related
扩展普通查询以加入相关表。如果要链接外键查找,也将执行必要的联接。由于您在select\u-related
子句中显式列出字段,因此它可能不会执行任何不必要的联接,但肯定不会有任何帮助。
if valueResults.objects.filter(value_id__item_id__status="yes", value_id__item_id__item_id=item_id).exists():
# do something