我有几个模型设置如下:
class Bar(models.Model):
baz = models.CharField()
class Foo(models.Model):
bar1 = models.ForeignKey(Bar)
bar2 = models.ForeignKey(Bar)
bar3 = models.ForeignKey(Bar)
在代码的其他地方,我最终得到了一个Bar的实例,并且需要找到它以某种身份附加的Foo。现在我想出了使用Q进行多个OR查询,如下所示:
foo_inst = Foo.objects.get(Q(bar1=bar_inst) | Q(bar2=bar_inst) | Q(bar3=bar_inst))
我需要弄清楚的是,实际命中的3个案例中的哪一个,至少是成员的名称(bar1,bar2或bar3)。有没有办法做到这一点?是否有更好的方法来构建查询以收集该信息?
答案 0 :(得分:1)
try:
Foo.objects.get(bar1=bar_inst)
print 'bar1'
except Foo.DoesNotExist:
try:
Foo.objects.get(bar2=bar_inst)
print 'bar2'
except Foo.DoesNotExist:
try:
Foo.objects.get(bar3=bar_inst)
print 'bar3'
except Foo.DoesNotExist:
print 'nothing found'
还可以考虑将related_name添加到模型的所有条形字段中。
答案 1 :(得分:0)
您可以更改内容并使用ChoiceField
?
BAR_VERSIONS = (
('Bar 1', 'bar1'),
('Bar 2', 'bar2'),
('Bar 3', 'bar3'),
)
class Bar(models.Model):
baz = models.CharField()
class Foo(models.Model):
bar = models.ForeignKey(Bar)
bar_version = models.ChoiceField(choices=BAR_VERSIONS)
然后:
try:
foo_instance = Foo.objects.get(bar=bar_instance)
except Foo.DoesNotExist:
# Handle Exception
pass
else:
print(foo_instance.bar_version)
<强>更新强>
根据您的评论,由于我们的想法是不设置任何bar
个设置,您仍然可以使用此方法,但使用带有ManyToManyField
参数的through
。如果你想添加bar4
- barn
而不是扩展你的try-except瀑布,这将使它在将来变得美观和可扩展。
https://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany
class Bar(models.Model):
baz = models.CharField()
class Foo(models.Model):
bars = models.ManyToManyField(bar, through='FooBars')
class FooBars(models.Model):
foor = models.ForeignKey(Foo)
bar = models.ForeignKey(Bar)
bar_version = models.ChoiceField(choices=BAR_VERSIONS)