2014-01-29 58 views
2

可以用Django查询来帮助我吗?我是这个新东西,我试图优化我的网站查询。以下是目前的案例: 我使用标准的用户模型作为基础模型,并且有三种类型的用户,它们与它相关:A,B和C.“用户”只能与这三种模型中的一种相关联。目前我有一个来自Model D的实例的列表,它也与User相关。 下面是我的代码用Django查询获取相关模型

D = D.objects.all() 
for element in D: 
try: 
    results.append(element.user.A) 
except: 
    try: 
     results.append(element.user.B) 
    except: 
     results.append(element.user.C) 

正如你已经注意到了,该解决方案是不是在这种情况下,最好的一个(也许这是最坏的)。我感谢任何帮助。 在此先感谢。

编辑:这是我的模型:

class A(models.Model) 
    facebook_id = models.CharField(max_length=20, blank=True, null=True) 
    user = models.OneToOneField(User, unique=True) 
    ... 

class B(models.Model) 
    user = models.OneToOneField(User, unique=True) 
    ... 

class C(models.Model) 
    user = models.OneToOneField(User, unique=True) 
    ... 

class D(models.Model): 
    user = models.ForeignKey(User) 
    F = models.ForeignKey(F) 
+1

请告诉我们您的models.py – lalo

+1

A是否确定要将用户扩展分为三种不同的模式?他们有多不同。也许你可以创建一个类型字段并使用'choices =(('A','User type A'),('B','User type B'),('C','User type C'),) ' – gwaramadze

+0

@remy_g, 感谢您的建议,但不幸的是,这两种模式退出不同。 –

回答

1

其实我有非常相同的问题,前一段时间,如果我是做一遍,我会遵循remy_g的暗示,无论多么不同的模型是。

这就是说,你可以使用hasattr()而不是杂乱的try/nest之外的东西。

http://docs.python.org/2/library/functions.html#getattr

它会是什么样子:

D = D.objects.all() 
for element in D: 
    if hasattr(element.user, "A"): 
     results.append(element.user.A) 
    elif hasattr(element.user, "B"): 
     results.append(element.user.B) 
    elif hasattr(element.user, "C"): 
     results.append(element.user.C) 

您可以改善这个根据自己的喜好,但你的想法...

希望这有助于

问候,

+0

谢谢您的建议。事实上,现在这一切都可以正常工作。如果我仍然有类似的问题,也许会使用@remy_g建议:) –