哪些Django queryset(s)的功能等同于需要输入的MySQL存储过程?

我有一个MySQL数据库,该数据库的表列出了独立的生成器,RPG系统和类型等。我的几个表都以某种方式连接到我的流派表。在Django中,我想构建一个模板,以流派的子弹作为参数,并显示数据库中所有相关图表,RPG系统,模块等的列表,作为一种简单的参考。我从来没有认真地使用过Django查询集,并且在选择正确的方法来获取所需内容时遇到了问题。

我正在运行MySQL 8.0.17版本(MySQL Community Server-GPL),而我的Django版本是(2,2,6,'final',0)。

这是一个存储过程,它将genre_slug作为参数并返回适合该类型的表的列表:

androidx.appcompat.app.appcompatdelegateImpl.ensureSubDecor() (appcompatdelegateImpl.java:659)
        at void androidx.appcompat.app.appcompatdelegateImpl.setContentView(int) (appcompatdelegateImpl.java:552)
        at void androidx.appcompat.app.AppCompatactivity.setContentView(int) (AppCompatactivity.java:161)
        at void com.example.sessiontracker2.Mainactivity.onCreate(android.os.Bundle) (Mainactivity.java:18)
        at void android.app.activity.performCreate(android.os.Bundle,android.os.PersistableBundle) (activity.java:7023)
        at void android.app.activity.performCreate(android.os.Bundle) (activity.java:7014)
        at void android.app.Instrumentation.callactivityOnCreate(android.app.activity,android.os.Bundle) (Instrumentation.java:1221)
        at android.app.activity android.app.activityThread.performLaunchactivity(android.app.activityThread$activityClientRecord,android.content.Intent) (activityThread.java:2818)
        at void android.app.activityThread.handleLaunchactivity(android.app.activityThread$activityClientRecord,android.content.Intent,java.lang.String) (activityThread.java:2943)
        at void android.app.activityThread.-wrap11(android.app.activityThread,android.app.activityThread$activityClientRecord,java.lang.String) (activityThread.java:-1)
        at void android.app.activityThread$H.handleMessage(android.os.Message) (activityThread.java:1663)
        at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:106)
        at void android.os.Looper.loop() (Looper.java:164)
        at void android.app.activityThread.main(java.lang.String[]) (activityThread.java:6606)
        at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object,java.lang.Object[]) (Method.java:-2)
        at void com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run() (RuntimeInit.java:438)
        at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:820)
    Caused by: java.lang.ClassnotFoundException: Didn't find class "android.view.View$OnUnhandledKeyEventListener" on path: DexPathList[[zip file "/data/app/com.example.sessiontracker2-n3R4gcLZyUPCaQna69VYOQ==/base.apk"],nativelibraryDirectories=[/data/app/com.example.sessiontracker2-n3R4gcLZyUPCaQna69VYOQ==/lib/arm,/system/lib,/vendor/lib]]
        at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:125)
        at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String,boolean) (ClassLoader.java:379)
        at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312)
        at void androidx.core.view.ViewCompat.setBackground(android.view.View,android.graphics.drawable.Drawable) (ViewCompat.java:2559)
        at void androidx.appcompat.widget.actionBarContainer.<init>(android.content.Context,android.util.AttributeSet) (actionBarContainer.java:63)
        at java.lang.Object java.lang.reflect.Constructor.newInstance0(java.lang.Object[]) (Constructor.java:-2)
        at java.lang.Object java.lang.reflect.Constructor.newInstance(java.lang.Object[]) (Constructor.java:334)
        at android.view.View android.view.LayoutInflater.createView(java.lang.String,java.lang.String,android.util.AttributeSet) (LayoutInflater.java:647)
        at android.view.View android.view.LayoutInflater.createViewFromTag(android.view.View,android.content.Context,android.util.AttributeSet,boolean) (LayoutInflater.java:790)
        at android.view.View android.view.LayoutInflater.createViewFromTag(android.view.View,android.util.AttributeSet) (LayoutInflater.java:730)
        at void android.view.LayoutInflater.rInflate(org.xmlpull.v1.XmlPullParser,android.view.View,boolean) (LayoutInflater.java:863)
        at void android.view.LayoutInflater.rInflateChildren(org.xmlpull.v1.XmlPullParser,boolean) (LayoutInflater.java:824)
        at android.view.View android.view.LayoutInflater.inflate(org.xmlpull.v1.XmlPullParser,android.view.ViewGroup,boolean) (LayoutInflater.java:515)
        at android.view.View android.view.LayoutInflater.inflate(int,boolean) (LayoutInflater.java:423)
        at android.view.View android.view.LayoutInflater.inflate(int,android.view.ViewGroup) (LayoutInflater.java:374)
        at android.view.ViewGroup androidx.appcompat.app.appcompatdelegateImpl.createSubDecor() (appcompatdelegateImpl.java:749)
        at void androidx.appcompat.app.appcompatdelegateImpl.ensureSubDecor() (appcompatdelegateImpl.java:659)
        at void androidx.appcompat.app.appcompatdelegateImpl.setContentView(int) (appcompatdelegateImpl.java:552)
        at void androidx.appcompat.app.AppCompatactivity.setContentView(int) (AppCompatactivity.java:161)
        at void com.example.sessiontracker2.Mainactivity.onCreate(android.os.Bundle) (Mainactivity.java:18)
        at void android.app.activity.performCreate(android.os.Bundle,android.os.PersistableBundle) (activity.java:7023)
I/zygote:     at void android.app.activity.performCreate(android.os.Bundle) (activity.java:7014)
        at void android.app.Instrumentation.callactivityOnCreate(android.app.activity,java.lang.Object[]) (Method.java:-2)
        at void com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run() (RuntimeInit.java:438)
        at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:820)
V/FA: Collection enabled
I/zygote: Rejecting re-init on previously-failed class java.lang.Class<androidx.core.view.ViewCompat$2>: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/view/View$OnUnhandledKeyEventListener;
        at void androidx.core.view.ViewCompat.setBackground(android.view.View,android.view.ViewGroup) (LayoutInflater.java:374)
        at android.view.ViewGroup androidx.appcompat.app.appcompatdelegateImpl.createSubDecor() (appcompatdelegateImpl.java:749)
        at void androidx.appcompat.app.appcompatdelegateImpl.ensureSubDecor() (appcompatdelegateImpl.java:659)
        at void androidx.appcompat.app.appcompatdelegateImpl.setContentView(int) (appcompatdelegateImpl.java:552)
I/zygote:     at void androidx.appcompat.app.AppCompatactivity.setContentView(int) (AppCompatactivity.java:161)
        at void com.example.sessiontracker2.Mainactivity.onCreate(android.os.Bundle) (Mainactivity.java:18)
        at void android.app.activity.performCreate(android.os.Bundle,/vendor/lib]]
        at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:125)
V/FA: App package,google app id: com.example.sessiontracker2,1:323497697052:android:1103c7db0bed07898ee4d9
I/zygote:     at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String,java.lang.Object[]) (Method.java:-2)
        at void com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run() (RuntimeInit.java:438)
        at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:820)
I/FA: App measurement is starting up,version: 12780
    To enable debug logging run: adb shell setprop log.tag.FA VERBOSE
    To enable faster debug mode event logging run:
      adb shell setprop debug.firebase.analytics.app com.example.sessiontracker2
I/zygote: Rejecting re-init on previously-failed class java.lang.Class<androidx.core.view.ViewCompat$2>: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/view/View$OnUnhandledKeyEventListener;
I/zygote:     at void androidx.core.view.ViewCompat.setBackground(android.view.View,java.lang.Object[]) (Method.java:-2)
        at void com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run() (RuntimeInit.java:438)
        at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:820)
D/FA: Debug-level message logging enabled
V/FA: Connecting to remote service
V/FA: Connection attempt already in progress
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.sessiontracker2,PID: 16590
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.sessiontracker2/com.example.sessiontracker2.Mainactivity}: java.lang.ClassCastException: androidx.constraintlayout.widget.ConstraintLayout cannot be cast to androidx.recyclerview.widget.RecyclerView
        at android.app.activityThread.performLaunchactivity(activityThread.java:2865)
        at android.app.activityThread.handleLaunchactivity(activityThread.java:2943)
        at android.app.activityThread.-wrap11(Unknown Source:0)
        at android.app.activityThread$H.handleMessage(activityThread.java:1663)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.activityThread.main(activityThread.java:6606)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:820)
     Caused by: java.lang.ClassCastException: androidx.constraintlayout.widget.ConstraintLayout cannot be cast to androidx.recyclerview.widget.RecyclerView
        at com.example.sessiontracker2.Mainactivity.onCreate(Mainactivity.java:19)
        at android.app.activity.performCreate(activity.java:7023)
        at android.app.activity.performCreate(activity.java:7014)
        at android.app.Instrumentation.callactivityOnCreate(Instrumentation.java:1221)
        at android.app.activityThread.performLaunchactivity(activityThread.java:2818)
        at android.app.activityThread.handleLaunchactivity(activityThread.java:2943) 
        at android.app.activityThread.-wrap11(Unknown Source:0) 
        at android.app.activityThread$H.handleMessage(activityThread.java:1663) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.activityThread.main(activityThread.java:6606) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:820) 

流派和表格(D100Generator)模型:

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 ;

views.py:

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,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',null=True)
...
    roll_110 = models.TextField('110',null=True)
    table_slug = models.SlugField('leave this blank,**kwargs):
        if not self.d_100_id:
            #Newly created object,so set slug
            self.table_slug = slugify(self.table_name)

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

genre.html模板:

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页面上,我收到错误消息“ DoesnotExist位于/​​ generators / genre / 9

类型匹配查询不存在。”

我希望该URL在给定URL中显示genre_slug而不是主键'genre'。也许我针对genre_slug使用了错误的逻辑?

xiaomeng722 回答:哪些Django queryset(s)的功能等同于需要输入的MySQL存储过程?

在我的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)
本文链接:https://www.f2er.com/3148926.html

大家都在问