Valueerror mit Multi-Table Vererbung in Django Admin
-
27-09-2019 - |
Frage
Ich habe zwei neue Klassen, die vererben Modell Eintrag:
class Entry(models.Model):
LANGUAGE_CHOICES = settings.LANGUAGES
language = models.CharField(max_length=2, verbose_name=_('Comment language'), choices=LANGUAGE_CHOICES)
user = models.ForeignKey(User)
country = models.ForeignKey(Country, null=True, blank=True)
created = models.DateTimeField(auto_now=True)
class Comment(Entry):
comment = models.CharField(max_length=2000, blank=True, verbose_name=_('Comment in English'))
class Discount(Entry):
discount = models.CharField(max_length=2000, blank=True, verbose_name=_('Comment in English'))
coupon = models.CharField(max_length=2000, blank=True, verbose_name=_('Coupon code if needed'))
Nach dem Hinzufügen dieser neuen Modelle dem Server-Betreiber über admin.site.register Ich erhalte Valueerror wenn sie versuchen, einen Kommentar oder einen Rabatt über Admin zu erstellen. Hinzufügen von Einträgen funktioniert.
Fehlermeldung:
Valueerror auf / admin / Bewertungen / Rabatt / add /
Can not assign " ''": "Discount.discount" muss eine "Discount" Instanz sein.
Anfrage Methode: GET
Anforderungs-URL: http://127.0.0.1:8000/admin/reviews/discount/ add /
Ausnahmetyp: Valueerror
Ausnahme Wert:
Can not assign " ''": "Discount.discount" muss eine "Discount" Instanz sein.
Ausnahme Ort: /Library/Python/2.6/site-packages/django/db/models/fields/related.py in Satz , Linie 211
Python-Executable: / usr / bin / python
Python Version: 2.6.1
Lösung
Der Grund für diesen Fehler erschienen war, weil ich denselben Spaltennamen verwendet, die bereits mit Modellnamen verwendet wurde. Karen T. dazu beigetragen, die folgende Antwort in Django Mailingliste :
Das Problem scheint zu sein, dass Sie ein Feld in Ihrem Kommentar Modell mit dem Namen mit dem gleichen Namen, nur Fall senken. Kommentar erbt von Eintrag, mit Multi-Table-Vererbung. Dies fügt ein OneToOneField in back Eintrag, der eine Nebenwirkung hat von ein ‚Kommentar‘ Attribut Eintrag hinzufügen. Dies ist das Attribut, mit dem Sie Zugriff auf den Kommentar mit dem zugehörigen Eintrag als Ergebnis der OneToOneField in Kommentar, und durch Voreingestellt ist der Name des Gegebenen verwandtes Modell, all-Klein.
Problem dann auftritt, wenn der Kommentar Modell „erbt alle Felder / Attribute des Eintrags: das geerbt ‚Kommentar‘ Attribut aus Der Eintritt ist offenbar über Reiten der angegebenes Kommentarfeld. das ist, wahrscheinlich ein Fehler, aber es scheint seit 1.0 dort gewesen. I hatte nicht jede Forschung getan, um zu sehen, ob es gewesen berichtet.
Als Abhilfe können Sie nennen Sie Ihre Felder etwas anderes als der Modellname alle klein geschrieben, oder Sie kann explizit angeben, die OneToOneField in den Kindermodels, Angabe parent_link = True und etwas anderes als die Modellnamen alle Kleinbuchstaben für related_name.
Andere Tipps
Hunch sagt, dass Sie mit der Erklärung Ihres Eintrag Klasse als abstrakt man tun könnten, wenn Sie einen Eintrag als eigentliches Objekt benötigen, zu
...rest of Entry model here...
created = models.DateTimeField(auto_now_add=True) ## ONLY set date when created, not every save
class Meta:
abstract = True
...methods for your model etc...