/ / Newbie 1. Versuch prefetch_related - gibt leer zurück - django, django-models, django-views

Newbie 1st Versuch bei prefetch_related - returns blank - django, django-models, django-views

Ich habe diese Frage schon einmal gestellt, aber ich habe keine Lösungen erhalten, daher habe ich versucht, die Frage dieses Mal präziser und klarer zu stellen.

Meine Datenbank hat das folgende vereinfachte Schema:

class RIAchievement(models.Model):
riAchievementID = models.AutoField(primary_key=True, db_column="riAchievementID")
userLanguageVersionID = models.ForeignKey(UserLanguageVersion, db_column="userLanguageVersionID", related_name="riAchievement_userLanguageVersionID")
class Meta:
db_table="riAchievement"

class UserLanguageVersion(models.Model):
userLanguageVersionID = models.AutoField(primary_key=True, db_column="userLanguageVersionID")
languageCodeID = models.ForeignKey(LanguageCode, db_column="languageCodeID", related_name="userLanguageVersion_languageCodeID")
class Meta:
db_table="userLanguageVersion"

class LanguageCode(models.Model):
languagecodeID = models.AutoField(primary_key=True, db_column="languageCodeID")
class Meta:
db_table="languageCode"

class Flag(models.Model):
flagID = models.AutoField(primary_key=True, db_column="flagID")
languageCodeID = models.ForeignKey(LanguageCode, db_column="languageCodeID", related_name="flag_languageCodeID")
flagIconPath = models.CharField(max_length=255, db_column="flagIconPath")
class Meta:
db_table="flag"

Im Wesentlichen kann Rachievement viele userlanguageversion s und userlanguageversion kann viele Sprachcode s haben, und Flag kann viele Sprachencode s haben.

Verwenden select_related kommt nicht zurück flag.flagIconPfad wegen der 1 zu viele Beziehung, also der Django docs Zustand muss ich verwenden prefetch_related, mit dem verwandter Name der 1 zu viele Fremdschlüssel.

Also ändere ich meinen Code in meinem view.py:

from django.shortcuts import render
from app_data.models import RIAchievement

def ri_achievements(request):

qs = RIAchievement.objects.select_related("riachievement", "userlanguageversion", "languagecode", "flag_languageCodeID").all()

return render(request, "index.html",{"qs": qs})

Und mein index.html:

{% for ri_achievement in qs %}
{{ ri_achievement.userLanguageVersionID.langaugeCodeID.flag_languageCodeID.flagIconPath }}
{% endfor %}

Aber dieser Code gibt nichts zurück.

Kann mir jemand Rat geben, da ich nicht sehen kann was ich falsch gemacht habe?

Antworten:

2 für die Antwort № 1

Ich schlage vor, Sie verwenden die Django-Shell python manage.py shell um herauszufinden, Ihre Anfrage - es wird sehr schwierig sein, es über die Vorlage "herauszufinden", wie es Fehler unterdrückt.

Zum Beispiel sieht es so aus, als hätten Sie einen Rechtschreibfehler, aber die Vorlage würde sich darüber nicht beschweren.

Lassen Sie uns Ihre Suchanfrage in Python aufteilen, damit wir Kommentare verwenden können

flagIconPath = (ri_achievement
.userLanguageVersionID # correct. direct FK
.langaugeCodeID # spelling error. but otherwise ok. direct FK
# this is now a one to many relationship - you now have a related manager
# NOT a single object. Many flags to one Code
.flag_languageCodeID
.latest("id") # you must pick which one you want - for example, the latest ID
.flagIconPath)

Um diese Abfrage effizienter zu gestalten, müssen SieWählen Sie einen verwandten Anruf aus, der die vollständigen Pfade durch diese Modelle enthalten muss. Sie übergeben Attribute so, als wären sie alle Fremdschlüssel im ursprünglichen Modell.

qs = RIAchievement.objects.select_related("userLanguageVersionID__languageCodeID")

Ich bin mir zu diesem Zeitpunkt nicht sicher über den Prefetch-Call, aber es sollte wahrscheinlich so aussehen

qs.prefetch_related("userLanguageVersionID__languageCodeID__flag_languageCodeID")

Mit all diesen verschachtelten Aufrufen könnte ein Vorabruf so weit reichen. Bist du sicher, dass du das willst?