Django:使用模型查询多个表

时间:2010-11-18 03:42:38

标签: django models

我目前想要运行一个SQL语句来过滤我的数据库,但它会访问多个表。从我在本网站上看过的其他例子中,他们都使用不在主键上的外键;但是,这是我目前的设置。我有两个问题,第一个是SQL过滤器。这些是我的模特:

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它们取决于所选择的内容。

谢谢,

史蒂夫

1 个答案:

答案 0 :(得分: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字段以及主题。
  • TutorProfile可以访问所有User,UserProfile和Tutor字段以及语言。

通过这种方式,您只需查找TutorProfile实例即可实现连接。

我应该提一下,在使用子类时,会自动从子类创建一个OneToOneField到超类。