Как построить SQL-запрос с двумя левыми объединениями, используя django ORM - PullRequest
0 голосов
/ 10 февраля 2012

Мне нужно построить запрос MySQL, и я хочу сначала попробовать с ORM django, а затем использовать raw как последнее средство.

Я нашел документацию по отдельным JOIN или JOIN между двумя таблицами, но нет примеров или, по крайней мере, простое (для начинающих) объяснение JOIN между тремя таблицами

Содержимое файла models.py равно

from django.db import models

# Create your models here.
class Threads(models.Model):
    name = models.CharField(max_length=100)
    author = models.CharField(max_length=100)
    date = models.DateTimeField("date published")
    slug = models.SlugField()

    def __unicode__(self):
        return self.name

class Posts(models.Model):
    name = models.CharField(max_length=100)
    text = models.TextField()
    author = models.CharField(max_length=100)
    date = models.DateTimeField("date published")
    slug = models.SlugField()

    def __unicode__(self):
        return self.name

class Relations(models.Model):
    thread = models.ForeignKey(Threads, related_name = "%(app_label)s_%(class)s_related")
    post = models.ForeignKey(Posts, related_name = "%(app_label)s_%(class)s_related")

и это SQL-запрос в необработанном виде, который я пытаюсь построить

SELECT forum_threads.id AS t_id, forum_threads.name AS t_name, forum_threads.slug AS t_slug, forum_posts.*
FROM forum_threads
LEFT JOIN forum_relations ON forum_threads.id=forum_relations.thread_id
LEFT JOIN forum_posts ON forum_relations.post_id=forum_posts.id
WHERE forum_threads.slug="<slug_name>"
GROUP BY forum_threads.id

"форум" - это название моего приложения

Теперь я не знаю, нужно ли мне подправлять / менять свои модели и если, как. Обратите внимание, что я могу изменить свои модели без каких-либо важных данных.

EDIT

Спасибо за все ваши ответы!

Хорошо, я немного поиграл с различными примерами, пока мне не удалось произвести что-то. Я получил это так:

thread = Threads.objects.filter(slug = slug)

posts = Posts.objects.filter(forum_relations_related__thread = thread[0].id)

Первый запрос - получить идентификатор потока из slug, а второй - вернуть все сообщения, связанные с потоком, с идентификатором этой темы.

Я попробую поиграть с партией M2M, так как у меня есть хотя бы один рабочий пример.

1 Ответ

1 голос
/ 10 февраля 2012

Почему бы просто не использовать соотношение M2M , вы можете использовать - , если это необходимо.

После этого вы можете получить тему по slug

thread = Threads.objects.get(slug=slug_name)

, а затем получить доступ к сообщениям, связанным с темой, через

thread.posts_set.all()
...