2010-11-18 100 views
2

我目前想運行一條SQL語句,它將過濾我的數據庫,但它訪問多個表。從我在本網站上閱讀的其他例子中,他們都使用不在主鍵上的外鍵;不過,這是我目前的設置。我有兩個問題,第一個是SQL過濾器。這些是我的型號:Django:使用模型查詢多個表

class UserProfile(models.Model): 
     user = models.ForeignKey(User, unique=True); 

     isATutor = models.BooleanField(); 
     timeAvailable = models.CharField(max_length=3); 

class TutorProfile(models.Model): 
     user = models.ForeignKey(User); 

     language = models.CharField(max_length=30); 
     unique_together = (("user", "language"),); 

class Tutor(models.Model): 
     user = models.ForeignKey(User); 

     subject = models.CharField(max_length=30); 
     unique_together = (("user", "subject"),); 

我現在正在使用原始SQL。

def sqlQuery(avail, lang, sub): 
    from django.db import connection, transaction 
    cursor = connection.cursor(); 

    cursor.execute("SELECT a.first_name, a.last_name, a.email FROM auth_user a, books_tutor b, books_tutorprofile c, books_userprofile d WHERE a.id = b.user_id AND a.id = c.user_id AND a.id = d.user_id AND b.subject=%s AND c.language=%s AND d.timeAvailable=%s", [sub, lang, avail]); 
    row = cursor.fetchall(); 

    return row; 

timeAvailable正在三個字符串的形式是「MAE」,其中M =上午,A =下午,E =晚上,如果不需要他們,我們會更換 - 例如'M--'只在早上提供。

所以第一個問題是我很想能夠保持上述SQL作爲Django模型。第二個問題是我需要一個查詢MAE的好方法。我想我可能不得不做8個不同的SQL部分和UNION他們取決於選擇什麼。

感謝,

史蒂夫

回答

6

爲什麼不使用子類?

class UserProfile(User): 
    time_available = models.CharField(max_length=3); 

class Tutor(UserProfile): 
    subject = models.CharField(max_length=30); 

class TutorProfile(Tutor): 
    language = models.CharField(max_length=30); 
    class Meta: 
     unique_together = ['username','subject','language'] # <--- username field from User base class. 
  • 用戶配置可以訪問所有用戶領域,加上time_available。
  • 導師可以訪問所有用戶,UserProfile字段以及主題。
  • TutorProfile可以訪問所有用戶,UserProfile和Tutor字段以及語言。

通過這種方式,您可以通過查找TutorProfile的實例來實現連接。

我應該提到,使用子類時,OneToOneField會自動從子類創建到超類。

+0

這很酷。問題:有什麼方法可以繼續執行用戶和主題/語言的獨特性?我從來沒有使用子類,並會閱讀更多關於它。我非常感謝答覆。 – user511622 2010-11-18 06:11:46

+0

當然。編輯原創以包含唯一性 – Thomas 2010-11-18 06:51:16

+0

欲瞭解更多信息,請參閱:http://docs.djangoproject.com/zh/dev/topics/db/models/#multi-table-inheritance。另外,不要忘記標記接受的答案;) – Thomas 2010-11-18 07:02:33