class PurchaseOrder(models.Model):
product = models.ManyToManyField('Product')
vendor = models.ForeignKey('VendorProfile')
dollar_amount = models.FloatField(verbose_name='Price')
class Product(models.Model):
products = models.CharField(max_length=256)
def __unicode__(self):
return self.products
J'ai ce code. Malheureusement, l'erreur vient dans admin.py avec leManyToManyField
class PurchaseOrderAdmin(admin.ModelAdmin):
fields = ['product', 'dollar_amount']
list_display = ('product', 'vendor')
L'erreur dit:
'PurchaseOrderAdmin.list_display [0]', 'product' est un ManyToManyField qui n'est pas pris en charge.
Cependant, il se compile lorsque je 'product'
sors de list_display
. Alors , comment puis - je afficher 'product'
en list_display
sans lui donner des erreurs?
edit : Peut-être qu'une meilleure question serait de savoir comment afficher un ManyToManyField
in list_display
?
get_queryset()
méthode optimisée pour votreModelAdmin
, voir stackoverflow.com/questions/12354099cached_property
- être aiderait. Mais je pense que ce ne serait probablement pas le cas. Lorsque vous utilisez un optimiséget_queryset
, vous pouvez par exemple y annoter / pré-traiter les données, comme faire la concaténation des produits en SQL au lieu de Django, et stocker vos données personnalisées dans votre jeu de requêtes. Ensuite, vous n'aurez besoin d'exécuter cette logique qu'une seule fois dans SQL et non pour chaque ligne lors de l'accès à la propriété.get_queryset
, je n'ai tout simplement pas eu le temps de lire la documentation complète (ni trouvé un exemple assez simple de ce que je devrais faire)De cette façon, vous pouvez le faire, veuillez consulter l'extrait de code suivant:
class Categories(models.Model): """ Base category model class """ title = models.CharField(max_length=100) description = models.TextField() parent = models.ManyToManyField('self', default=None, blank=True) when = models.DateTimeField('date created', auto_now_add=True) def get_parents(self): return ",".join([str(p) for p in self.parent.all()]) def __unicode__(self): return "{0}".format(self.title)
Et dans votre méthode d'appel de module admin.py comme suit:
class categories(admin.ModelAdmin): list_display = ('title', 'get_parents', 'when')
la source