哪些 Django 查询集在功能上等同于需要输入的 MySQL 存储过程?
What Django queryset(s) would be the functional equivalent to MySQL stored procedure that requires an input?
我有一个 MySQL 数据库,其中 table 列出了独立生成器、RPG 系统和类型等。我的几个 table 以某种方式连接到我的流派 table。在 Django 中,我想构建一个模板,将类型的 slug 作为参数,并显示数据库中找到的所有相关图表、RPG 系统、模块等的列表,作为一种简单的参考。我从来没有认真地使用过 Django 查询集,而且我在选择正确的方法来获得我需要的东西时遇到了问题。
我是 运行 MySQL 版本 8.0.17 (MySQL Community Server - GPL),我的 Django 版本是 (2, 2, 6, 'final' , 0).
这是一个将 genre_slug 作为参数和 return 符合类型的 table 列表的存储过程:
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 ;
流派和 table(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
views.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 页面上,我收到错误消息“在 /generators/genre/9
处不存在
类型匹配查询不存在。"
我希望 URL 显示 genre_slug 而不是给定 URL 中的主键 'genre'。也许我在关注 genre_slug?
时使用了错误的逻辑
我的 views.py:
def genre(request, genre_slug):
genre_page = get_object_or_404(Genre, pk=genre_slug)
g = genre_slug
genre_tables = D100Generator.objects.filter(genre_id__exact=g)
context = {
'genre_page': genre_page,
'genre_tables': genre_tables,
}
return render (request, 'generators/genre.html', context)
我有一个 MySQL 数据库,其中 table 列出了独立生成器、RPG 系统和类型等。我的几个 table 以某种方式连接到我的流派 table。在 Django 中,我想构建一个模板,将类型的 slug 作为参数,并显示数据库中找到的所有相关图表、RPG 系统、模块等的列表,作为一种简单的参考。我从来没有认真地使用过 Django 查询集,而且我在选择正确的方法来获得我需要的东西时遇到了问题。
我是 运行 MySQL 版本 8.0.17 (MySQL Community Server - GPL),我的 Django 版本是 (2, 2, 6, 'final' , 0).
这是一个将 genre_slug 作为参数和 return 符合类型的 table 列表的存储过程:
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 ;
流派和 table(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
views.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 页面上,我收到错误消息“在 /generators/genre/9
处不存在类型匹配查询不存在。"
我希望 URL 显示 genre_slug 而不是给定 URL 中的主键 'genre'。也许我在关注 genre_slug?
时使用了错误的逻辑我的 views.py:
def genre(request, genre_slug):
genre_page = get_object_or_404(Genre, pk=genre_slug)
g = genre_slug
genre_tables = D100Generator.objects.filter(genre_id__exact=g)
context = {
'genre_page': genre_page,
'genre_tables': genre_tables,
}
return render (request, 'generators/genre.html', context)