2017-06-06 68 views
-1

django是否提供了一種驗證django查詢集中模型類型的方法,例如通過相關對象進行過濾?比方說,我們有以下型號:驗證django查詢集相關對象的類型參數

class Person(models.Model): 
    name = models.CharField(max_length=5) 

class Author(models.Model): 
    name = models.CharField(max_length=25) 

class Book(models.Model): 
    name = models.CharField(max_length=5) 
    author = models.ForeignKey(Author) 

而且

p = Person.objects.all().first() 
query = Book.objects.filter(author=p) 

過濾所有的書籍,auhtor_id等於給定爲person_id(P_ID),雖然書是指作者,而不是人。

當然,這是程序員避免這種錯誤的責任,但它是可能的。

這發生在Django 1.7

+0

當你運行該代碼時會發生什麼? –

+0

至少在django 1.7它過濾器通過author_id = p.pk – pteo

+0

@pteo通過更有意義的維護你的代碼,而不是默認的版本,顯然不一致的版本記住,這兩個模型甚至沒有相關的第一位 –

回答

0

如果author_id直接使用id是一樣person_id可以過濾

query = Book.objects.filter(author_id=p.id) 
+0

我相信最好使用'p.pk'而不是'p.id'。 –

+0

這是一個口味的問題 – e4c5

+0

但'author_id'可能與'person_id'不同 – pteo

2
p = Person.objects.all().first() 
query = Book.objects.filter(author=p) 

你真的嘗試呢?據對我來說,應該提高沿着「必須是作者實例」

現在,如果你想避免這種錯誤的線ValueError的東西,你需要使用一個ID,和摩西像往常一樣有一個很好的回答顯示瞭如何它已完成

+0

至少在django 1.7中它執行時不會引發任何異常 – pteo

+0

可能在1.7中完成,我忘記了,但當前版本肯定有這個驗證。 – e4c5

+0

類型檢查[在Django 1.8中添加](https://docs.djangoproject.com/en/1.11/releases/1.8/#query-relation-lookups-now-check-object-types)。 Django 1.7已經有一段時間了。 – Alasdair

相關問題