根据字段获取模型实例?
问题描述:
我的模型定义:根据字段获取模型实例?
class Thing1(models.Model):
thing2s = models.ManyToManyField(Thing2, blank=True)
我有Thing2的实例,称为myThing2。 我想要做这样的事情:
Thing1.objects.get(thing2s__contains = myThing2)
这不工作的功能代码,但希望你明白我的意思。 (我试图找到一个Thing1,它的thing2s字段中有myThing2。)我该怎么做?
感谢您的帮助!
答
就我个人而言,我会为您的多对多定义添加'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()
答
这不是测试,但我相信你会说
Thing1.objects.filter(thing2s = myThing2)
由于多个Thing1可以有Thing2,使用过滤器拉出所有有myThing2的Thing1s的。
过滤器返回Thing1的列表。
好感谢您的帮助,但实际上,我的数据库是由这样一个Thing2只能是长到一件事1。这个主要问题是在我的“thing2s = myThing2”声明中。我不知何故必须通过Thing2s的thing2s列表来查看myThing2是否在该列表中。 – Andrew 2011-02-25 02:00:25
听起来你可能实际上需要使用ForeignKey而不是ManyToMany - 这就是你描述的情况下使用的关系。话虽如此,如果您使用的是ManyToMany,lovefaithswing的答案是正确的 - thing2s = myThing2将设置连接来过滤关联的Things2的列表。 – 2011-02-25 02:48:08