2017-06-06 66 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

相关问题