Какие наборы запросов Django будут функциональным эквивалентом хранимой процедуры MySQL, требующей ввода? - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть база данных MySQL, в которой есть таблицы с перечнем автономных генераторов, систем RPG и жанров, среди прочего. Несколько моих столов каким-то образом связаны с моим жанровым столом. В Django я хотел бы создать шаблон, который использует слаг жанра в качестве аргумента и отображает списки всех соответствующих диаграмм, систем RPG, модулей и т. Д., Найденных в базе данных, в качестве своего рода простого справочника. Я никогда серьезно не работал с наборами запросов Django, и у меня возникают проблемы с выбором правильных методов, чтобы получить то, что мне нужно.

Я использую MySQL версии 8.0.17 (MySQL Community Server - GPL), и моя версия Django (2, 2, 6, 'final', 0).

Этохранимая процедура, которая принимает аргумент genre_slug в качестве аргумента и возвращает список таблиц, соответствующих жанру:

DELIMITER @@

CREATE PROCEDURE genres_tables
#genre_slug is provided by the link clicked on by the user
(IN slug VARCHAR(72))
BEGIN
SELECT g.genre, t.`table_name`
FROM generators_genre g
#Joins to get to D100Generator table
INNER JOIN generators_d100generator t
ON g.genre=t.genre_id_id
WHERE t.genre_id_id = (
    SELECT genre
    FROM generators_genre
    WHERE genre_slug = slug); /*The slug is provided by the link clicked on*/
END @@

DELIMITER ;

Модели жанра и таблицы (D100Generator):

class Genre(models.Model):
    genre = models.AutoField(primary_key=True)
    genre_name = models.CharField(max_length=50)
    genre_slug = models.SlugField('leave this blank, autosaves new slug', max_length=72, unique=True, blank=True, null=True)

    def save(self, *args, **kwargs):
        if not self.genre:
            #Newly created object, so set slug
            self.genre_slug = slugify(self.genre_name)

        super(Genre, self).save(*args, **kwargs)
    def __str__(self):
        return self.genre_name

class D100Generator(models.Model):
    d_100_id = models.AutoField(primary_key=True)
    table_name = models.CharField('table name', max_length=100)
    system_id = models.ForeignKey(System, on_delete=models.CASCADE, blank=True, null=True)
    genre_id = models.ForeignKey(Genre, on_delete=models.CASCADE)
    chart_type = models.CharField('Die used', max_length=15)
    chart_instructions = models.TextField('Chart instructions & explanation')
    roll_1 = models.TextField('1', blank=True, null=True)
...
    roll_110 = models.TextField('110', blank=True, null=True)
    table_slug = models.SlugField('leave this blank, autosaves new slug', max_length=72, unique=True, blank=True, null=True)

    def save(self, *args, **kwargs):
        if not self.d_100_id:
            #Newly created object, so set slug
            self.table_slug = slugify(self.table_name)

        super(D100Generator, self).save(*args, **kwargs)
    def __str__(self):
        return self.table_name

представления. py:

from django.shortcuts import get_object_or_404, render
from .models import Genre, D100Generator

def genre(request, slug):
    genre_page = get_object_or_404(Genre, pk=slug)
    chosen_genre = Genre.objects.get(genre_slug__exact=slug)
    genre_tables = D100Generator.objects.get(genre_id__exact=chosen_genre.genre)

    context = {
        'genre_page': genre_page,
        'genre_tables': genre_tables,
    }
    return render (request, 'generators/genre.html', context)

шаблон genre.html:

<h1>{{ genre_page.genre_name }}</h1>

<p>This genre is referenced by the following:</p>

<h2>Tables</h2>
<ul>
{% for table in genre_tables %}
    <li><a href="{% url 'generators:table' table_slug=table.pk %}">{{ table.table_name }}</a></li>
{% endfor %}
</ul>

На странице genre.html я получаю сообщение об ошибке "DoesNotExist at / generators / genre / 9

Запрос соответствия жанра не существует. "

Я ожидал, что на URL будет отображаться genre_slug вместо первичного ключа 'genre' в данном URL. Может быть, я использую неправильную логику, ориентируясь на genre_slug?

...