Мне нужно построить запрос 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, так как у меня есть хотя бы один рабочий пример.