Django: запрос нескольких таблиц с использованием моделей - PullRequest
2 голосов
/ 18 ноября 2010

В настоящее время я хочу запустить оператор 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 и объединить их в зависимости от того, что выбрано.

Спасибо,

Стив

1 Ответ

6 голосов
/ 18 ноября 2010

почему бы не использовать подклассы?

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.
  • У репетитора есть доступ ко всем полям «Пользователь», «Профиль пользователя», а также тема.
  • TutorProfile имеет доступ ко всем полям User, UserProfile и Tutor, а также к языку.

таким образом, вы можете достичь объединения, просто посмотрев экземпляр TutorProfile.

Следует отметить, что при использовании подклассов OneToOneField автоматически создается из подкласса в суперкласс.

...