2010-11-18 25 views
2

現在、データベースをフィルタリングするが、複数のテーブルにアクセスするSQL文を実行したい。私がこのウェブサイトで読んだ他の例から、彼らはすべてプライマリキーではない外部キーを使います。しかし、それは私の現在の設定です。私は2つの問題を抱えています。最初は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は、3文字の文字列を取っているが、それらが不要な場合はMは=朝、A =午後、E =イブニングと、私たちはと交換しますフォームのMAE "である - 例えば「M--」は朝のみ利用可能です。

最初の問題は、上記のSQLをdjangoモデルとして保持できることです。 2番目の問題は、私は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. 
  • のUserProfileは、すべてのユーザー・フィールドへのアクセス、プラスtime_availableを持っています。
  • Tutorは、すべてのUser、UserProfileフィールド、およびsubjectにアクセスできます。
  • TutorProfileは、User、UserProfile、Tutorのすべてのフィールド、言語にアクセスできます。

このようにして、TutorProfileのインスタンスを検索するだけで結合を達成できます。

サブクラス化を使用する場合は、サブクラスからスーパークラスにOneToOneFieldが自動的に作成されることに注意してください。

+0

これはかなりクールです。あなたに質問する:ユーザとサブジェクト/言語の一意性を引き続き維持する方法はありますか?私はサブクラスを使ったことは一度もありませんでした。私はその答えを大いに感謝します。 – user511622

+0

一意性を含めるために編集したオリジナル – Thomas

+0

詳細については、http://docs.djangoproject.com/ja/dev/topics/db/models/#multi-table-inheritanceを参照してください。また、受け入れられた回答をマークすることを忘れないでください;) – Thomas

関連する問題