2017-03-21 5 views
0

Ich habe ein Modell und benutzerdefinierte ManagerDjango db raw MySQL ausführen

Modell

class VideoDescription(models.Model): 
    title_eng = models.CharField(max_length=120, unique=True) 
    title_ru = models.CharField(max_length=120, unique=True) 
    slug = models.SlugField(max_length=200, unique=True, blank=True) 
    rating = models.IntegerField(default=0) 
    pub_date_start = models.DateField() 
    poster = models.ImageField(upload_to=get_poster_path) 
    genre = models.CharField(validators=[validate_comma_separated_integer_list], max_length=10, default=0) 
    description = models.TextField(blank=True) 

objects = VideoDescriptionManager() 

class VideoDescriptionManager(models.Manager): 
def get_video_by_genre(self, genre): 
    from django.db import connection 
    with connection.cursor() as cursor: 
     cursor.execute('''select m.id, m.title_eng, m.title_ru, m.slug, m.rating, m.pub_date_start, 
     m.poster, m.genre, m.description, COUNT(*) from main_app_videodescription m 
         where genre like "%%%s%%";''', [genre]) 
     result_list = [] 
     for row in cursor.fetchall(): 
      p = self.model(id=row[0], title_eng=row[1], title_ru=row[2], slug=row[3], rating=row[4], 
          pub_date_start=row[5], poster=row[6], genre=row[7], description=row[8]) 
      p.num_responses = row[9] 
      result_list.append(p) 
     return result_list 

Und ich habe einen Fehler bekommt:

django.db.utils.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 0, and there are 1 supplied. 

Google me [Genre] ändert im Gespräch mit (Genre,) in einer rohen SQL-Abfrage, aber es hilft nicht. Was kann ich tun, um es zu beheben?

+1

Warum verwenden Sie Raw Sql hier? Sie können ['contains'] (https://docs.djangoproject.com/en/1.11/ref/models/querysets/#std:fieldlookup-contains) für den Filter für' genre' verwenden. Ich verstehe nicht, warum Sie ein 'COUNT (*)' haben, wenn Sie kein Join oder Groupby haben. – Alasdair

+0

@Alasdair Weil ich nichts über 'contains' weiß. Vielen Dank. –

Antwort

1

sqlite verwendet %s nicht für Parameter, es verwendet ?.

Aber entweder mit sqlite oder einer anderen db, können Sie die Parameterersetzung nicht verwenden, um einen Parameter in der Mitte eines Strings einzufügen. Sie müssen die Zeichenfolge separat erstellen und dann mithilfe der Parameter einfügen. Also:

param = "%{}%".format(genre) 
cursor.execute('''select m.id, m.title_eng, m.title_ru, m.slug, m.rating, m.pub_date_start, 
        m.poster, m.genre, m.description, COUNT(*) from main_app_videodescription m 
         where genre like ?;''', [param]) 

Beachten Sie, dass mit .format die Notwendigkeit entfernt die Prozente zu verdoppeln-zu entkommen.

+0

Es ist ein Django-Cursor - ich dachte, dass er '% s' für Platzhalter verwendet, selbst wenn Sie sqlite verwenden. – Alasdair

+0

Jetzt habe ich einen Fehler "TypeError: nicht alle Argumente während der Formatierung von Zeichenfolgen konvertiert" –

Verwandte Themen