2015-09-21 34 views
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進行過濾。這可能嗎?

回答

0

select_related是一個性能調優工具,而不是與存在測試有任何關係。它不會改變可能的查詢類型。可以使用__表示法對外鍵關係進行過濾 - 有關示例,請參閱docs。例如,通過對valueItemsvalueResults模型鏈接:

if valueResults.objects.filter(value_id__item_id__status="yes", value_id__item_id__item_id=item_id).exists(): 
    # do something 
+0

select_related:返回一個QuerySet,將「跟隨」外鍵關係,選擇附加相關對象的數據時,它執行其查詢。這是一個性能提升者,它會導致一個更復雜的查詢,但意味着以後使用外鍵關係不需要數據庫查詢。 –

+0

exists():如果QuerySet包含任何結果,則返回True,否則返回False。這儘可能以最簡單和最快的方式執行查詢,但它確實執行與普通QuerySet查詢幾乎相同的查詢。 據我所知,由於select_related返回一個查詢集,我應該能夠對它執行一個exists()。 –

+0

在'exists'查詢中使用'select_related'在語義上不正確,這只是無用的。基本上'select_related'擴展了一個正常的查詢以加入相關的表。如果您鏈接的外鍵查找也會進行必要的連接。既然你明確地在你的'select_related'子句中列出了字段,它可能不會做任何不必要的連接,但它肯定無濟於事。 –