2013-08-07 18 views
45
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 

Ich habe diesen Code. Leider kommt der Fehler in admin.py mit dem ManyToManyFieldviele-zu-viele in der liste display django

class PurchaseOrderAdmin(admin.ModelAdmin): 
    fields = ['product', 'dollar_amount'] 
    list_display = ('product', 'vendor') 

Der Fehler sagt:

'PurchaseOrderAdmin.list_display [0]', 'Produkt' ein ManyToManyField ist die nicht unterstützt wird.

Allerdings kompiliert es, wenn ich 'product' aus list_display nehme. Wie kann ich 'product' in list_display anzeigen, ohne Fehler zu geben?

bearbeiten: Vielleicht wäre eine bessere Frage, wie Sie eine ManyToManyField in list_display anzeigen?

Antwort

96

Sie können es möglicherweise nicht direkt tun. From the documentation of list_display

ManyToManyField Felder nicht unterstützt werden, weil die Ausführen eine separate SQL-Anweisung für jede Zeile in der Tabelle bringen würde. Wenn Sie dies trotzdem tun möchten, geben Sie Ihrem Modell eine benutzerdefinierte Methode und fügen Sie den Namen dieser Methode zu list_display hinzu. (Siehe unten für mehr auf individuelle Methoden in list_display.)

Sie etwas tun können:

class PurchaseOrderAdmin(admin.ModelAdmin): 
    fields = ['product', 'dollar_amount'] 
    list_display = ('get_products', 'vendor') 

    def get_products(self, obj): 
     return "\n".join([p.products for p in obj.product.all()]) 

oder ein Modell Methode definieren, und verwenden, die

class PurchaseOrder(models.Model): 
    product = models.ManyToManyField('Product') 
    vendor = models.ForeignKey('VendorProfile') 
    dollar_amount = models.FloatField(verbose_name='Price') 

    def get_products(self): 
     return "\n".join([p.products for p in self.product.all()]) 

und im admin list_display

list_display = ('get_products', 'vendor') 
+0

Diese wie eine wirklich gute Lösung aussieht. Vielen Dank. Obwohl ich jetzt eine Fehlermeldung bekomme, die besagt, dass "Nullwert in der Spalte" product_id "die Nicht-Null-Bedingung verletzt " Irgendeine Idee, was das bedeutet? – Mdjon26

+0

Das könnte ein Datenproblem sein. Überprüfen Sie die Werte in der Datenbank – karthikr

+1

Da dies die Datenbank in die Knie geht, wie würden Sie es mit select_related() oder prefetch_related() tun, um die Leistung zu verbessern? – gorus

7

Auf diese Weise können Sie es tun, bitte den folgenden Ausschnitt Kasse:

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) 

Und in Ihrer Methode admin.py Modul Aufrufs wie folgt:

class categories(admin.ModelAdmin): 
    list_display = ('title', 'get_parents', 'when')