2014-01-29 60 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建議:) –