ValueError con multi-tavolo eredità in Django Admin
-
27-09-2019 - |
Domanda
ho creato due nuove classi che ereditano il modello Entry:
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'))
Dopo aver aggiunto questi nuovi modelli di amministrazione via admin.site.register sto ottenendo ValueError quando si cerca di creare un commento o uno sconto tramite admin. Aggiunta di voci funziona bene.
msg di errore:
ValueError a / admin / recensioni / sconto / aggiungere /
Impossibile assegnare " ''": "Discount.discount" deve essere un esempio "Sconto".
Richiesta Metodo: GET
Richiesta URL: http://127.0.0.1:8000/admin/reviews/discount/ aggiungere /
Eccezione Tipo: ValueError
Eccezione Valore:
Impossibile assegnare " ''": "Discount.discount" deve essere un esempio "Sconto".
Eccezione Località: /Library/Python/2.6/site-packages/django/db/models/fields/related.py in set , la linea 211
Python eseguibile: / usr / bin / python
Python Versione: 2.6.1
Soluzione
La ragione di questo errore è apparso è stato perché ho usato lo stesso nome di colonna che è già stato utilizzato con il nome del modello. Karen T. ha contribuito la seguente risposta in Django mailing list :
Il problema sembra essere che hai chiamato un campo nel modello commento con lo stesso nome, abbassare unico caso. Commento eredita da ingresso, utilizzando multi-tavolo-ereditarietà. Questo aggiunge un OneToOneField nel Commento di nuovo a Entry, che ha un effetto collaterale di l'aggiunta di un attributo 'commento' a voce. Questo è l'attributo che consente di accedere al commento associato alla Entrata a seguito della OneToOneField in commento, e DEFAULT si è dato il nome di il modello relativo, tutto in minuscolo.
Il problema allora si verifica quando il commento modello "eredita tutta la campi / attributi di entrata: il ereditato attributo 'commento' dal L'ingresso è a quanto pare over-sella alla specificata campo di commento. Quello è probabilmente di un bug, ma sembra sono stati lì dal 1.0. Non ho fatto alcuna ricerca per vedere se è stato segnalati.
Per risolvere il problema si può denominare i campi di qualcosa di diverso il nome del modello tutti caratteri minuscoli, o può specificare esplicitamente il OneToOneField nei modelli del bambino, specificando parent_link = True e qualcosa di diverso dal nome del modello tutto in minuscolo per related_name.
Altri suggerimenti
Hunch dice si potrebbe fare con dichiarando la classe Entry come un astratto a meno che non avete bisogno di una voce come un oggetto vero e proprio, anche
...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...