[英]What Django queryset(s) would be the functional equivalent to MySQL stored procedure that requires an input?
我有一個 MySQL 數據庫,其中包含列出獨立生成器、RPG 系統和流派等的表格。 我的幾個表以某種方式連接到我的流派表。 在 Django 中,我想構建一個模板,將流派的 slug 作為參數,並顯示數據庫中所有相關圖表、RPG 系統、模塊等的列表,作為一種簡單的參考。 我從來沒有認真使用過 Django 查詢集,我在選擇正確的方法來獲得我需要的東西時遇到了問題。
我正在運行 MySQL 版本 8.0.17(MySQL 社區服務器 - 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 在給定的 URL 中顯示genre_slug 而不是主鍵“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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.