2010-01-04 47 views
0

我有多个模型都有一个FK到同一个模型。 我所知道的是FK,我如何确定哪些型号附有FK?用一个值查询多个模型

下面一个例子来clearify:

class ModelA(models.Model): 
     title = models.CharField("title", max_length=80) 

class ModelB(models.Model): 
     fk = models.ForeignKey(ModelA) 

class ModelC(models.Model): 
     fk = models.ForeignKey(ModelA) 

我怎样才能找出不使用try /除了在每个模型B或C是否有FK? (FK的只能是他们中的一个,在这种情况下,记录我只加了两个模型,但在现实世界中的应用程序有哪些有FK到MODELA车型多种可能的NOx量)

回答

0
if ModelB.objects.filter(fk=your_fk): 
    print "B" 
else: 
    print "C" 

如果您不确定这FK是否出现在B或C中的全部,添加其他检查:

if ModelB.objects.filter(fk=your_fk): 
    print "B" 
elif ModelC.objects.filter(fk=your_fk): 
    print "C" 
else: 
    print "none" 
+0

。尝试/除了什么问题?你想使用单个数据库查询来检查两个结果吗? – 2010-01-04 19:16:04

+0

让我们假设我有20个模型,我不想尝试/除了所有这些模型。我想知道是否有一种方法来查询检查结果的所有模型。否则,我必须制作一个中间模型。 – swoei 2010-01-04 19:42:09

+0

你的意图是什么 - 时间优化(使一个复杂的请求,而不是20个简单)或者只是一个句法方便? – 2010-01-04 21:00:05

0

如果像你说的,你有许多型号foreignkeys到ModelA也许你应该考虑在一个领域ModelA哪个缓存了这些信息?它可以通过save()方法ModelB/C/..或通过数据库存储过程进行更新。

+0

这个问题呢? – 2010-01-04 20:58:04

0

如果你以后语法糖和查询的数量减少试试这个:

a=ModelA.objects.annotate(nb=Count('modelb'), nc=Count('modelc')).get(pd=your_fk) 
if a.nb: 
    return 'B' 
elif a.nc: 
    return 'C' 
else: 
    return 'A' 

但我觉得这是太相似了尝试/除了你提到的(Django的> = V1.1)