0
我想使用Django的select_related使查詢,將通過兩個單獨的模型。Django的select_related - 引用的過濾引用
有條件的這個樣子的(注意,值是一個重命名 - 它不涉及到任何有關值語法的東西):
if valueResults.objects.select_related("value_id__item_id").filter(status_code="yes", item_id=item_id).exists():
return JSONResponse({'message':'Yes', 'status':status.HTTP_200_OK})
elif valueResults.objects.select_related("value_id__item_id").filter(status_code="no", item_id=item_id).exists():
return JSONResponse({'message':'No’, 'status':status.HTTP_200_OK})
else:
return JSONResponse({'message':'There are no items matching that item_id', 'status': status.HTTP_404_NOT_FOUND})
數據,數據模型是這樣的:
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模型的status_code和Items的item_id進行過濾。這可能嗎?
select_related:返回一個QuerySet,將「跟隨」外鍵關係,選擇附加相關對象的數據時,它執行其查詢。這是一個性能提升者,它會導致一個更復雜的查詢,但意味着以後使用外鍵關係不需要數據庫查詢。 –
exists():如果QuerySet包含任何結果,則返回True,否則返回False。這儘可能以最簡單和最快的方式執行查詢,但它確實執行與普通QuerySet查詢幾乎相同的查詢。 據我所知,由於select_related返回一個查詢集,我應該能夠對它執行一個exists()。 –
在'exists'查詢中使用'select_related'在語義上不正確,這只是無用的。基本上'select_related'擴展了一個正常的查詢以加入相關的表。如果您鏈接的外鍵查找也會進行必要的連接。既然你明確地在你的'select_related'子句中列出了字段,它可能不會做任何不必要的連接,但它肯定無濟於事。 –