2011-02-25 81 views
1

我的模型定义:根据字段获取模型实例?

class Thing1(models.Model): 
    thing2s = models.ManyToManyField(Thing2, blank=True) 

我有Thing2的实例,称为myThing2。 我想要做这样的事情:

Thing1.objects.get(thing2s__contains = myThing2) 

这不工作的功能代码,但希望你明白我的意思。 (我试图找到一个Thing1,它的thing2s字段中有myThing2。)我该怎么做?

感谢您的帮助!

回答

2

就我个人而言,我会为您的多对多定义添加'related_name'。

喜欢的东西

class Thing1(models.Model): 
    thing2s = models.ManyToManyField(Thing2, blank=True, related_name='thing1s') 

然后,从Thing2,您可以访问 'thing1s',它涉及到由....

thing2.thing1s.all() 

但是,我要问,作为如上所述,如果thing2只能与一个thing1相关,那么你应该使用ForeignKey(在Thing2中,而不是Thing1中)而不是ManyToMany。但是,上述解决方案仍然有效。

所以,你的类将是....

class Thing1(models.Model): 
    pass 

class Thing2(models.Model): 
    thing1 = models.ForeignKey(Thing1, blank=True, related_name='thing2s') 

所以,从thing2,你可以得到在通过简单的单thing1 ....

a_thing1 = thing2.thing1 

,并从thing1,你可以得到所有通过引用它的thing2s列表....

thing2s = thing1.thing2s.all() 
2

这不是测试,但我相信你会说

Thing1.objects.filter(thing2s = myThing2) 

由于多个Thing1可以有Thing2,使用过滤器拉出所有有myThing2的Thing1s的。

过滤器返回Thing1的列表。

+0

好感谢您的帮助,但实际上,我的数据库是由这样一个Thing2只能是长到一件事1。这个主要问题是在我的“thing2s = myThing2”声明中。我不知何故必须通过Thing2s的thing2s列表来查看myThing2是否在该列表中。 – Andrew 2011-02-25 02:00:25

+1

听起来你可能实际上需要使用ForeignKey而不是ManyToMany - 这就是你描述的情况下使用的关系。话虽如此,如果您使用的是ManyToMany,lovefaithswing的答案是正确的 - thing2s = myThing2将设置连接来过滤关联的Things2的列表。 – 2011-02-25 02:48:08