2013-08-07 43 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 

Tôi có mã đó. Thật không may, lỗi do thỏa thuận hợp admin.py với ManyToManyFieldnhiều người trong danh sách hiển thị django

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

Lỗi nói:

'PurchaseOrderAdmin.list_display [0]', 'sản phẩm' là một ManyToManyField mà không được hỗ trợ.

Tuy nhiên, nó biên dịch khi tôi lấy 'product' ra khỏi list_display. Vậy làm thế nào tôi có thể hiển thị 'product' trong list_display mà không đưa ra lỗi?

chỉnh sửa: Có thể câu hỏi hay hơn sẽ là cách bạn hiển thị ManyToManyField trong list_display?

Trả lời

96

Bạn không thể thực hiện trực tiếp. From the documentation of list_display

lĩnh vực ManyToManyField không được hỗ trợ, bởi vì đó sẽ đòi hỏi thực hiện một câu lệnh SQL riêng biệt cho mỗi hàng trong bảng. Nếu bạn muốn thực hiện điều này, hãy cung cấp cho mô hình của bạn một phương thức tùy chỉnh và thêm tên của phương thức đó vào danh sách hiển thị. (Xem dưới đây để biết thêm về tùy chỉnh phương pháp trong list_display.)

Bạn có thể làm một cái gì đó như thế này:

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()]) 

HOẶC xác định một phương pháp mô hình, và sử dụng rằng

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()]) 

và trong quản trị list_display

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

này trông giống như một giải pháp thực sự tốt. Cảm ơn bạn. Mặc dù, bây giờ tôi nhận được một lỗi nói rằng "giá trị null trong cột" product_id "vi phạm ràng buộc không null " Bất kỳ ý tưởng điều này có nghĩa là gì? – Mdjon26

+0

Đó có thể là vấn đề về dữ liệu. Kiểm tra các giá trị trong cơ sở dữ liệu – karthikr

+1

Vì điều này làm giảm cơ sở dữ liệu xuống đầu gối của nó, bạn sẽ làm như thế nào với select_related() hoặc prefetch_related() để cải thiện hiệu suất? – gorus

7

Bằng cách này bạn có thể làm điều đó, vui lòng kiểm tra các đoạn mã sau:

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) 

Và trong phương pháp mô-đun gọi admin.py của bạn như sau:

class categories(admin.ModelAdmin): 
    list_display = ('title', 'get_parents', 'when') 
Các vấn đề liên quan