【问题标题】:Django list_select_related gives me this errorDjango list_select_related 给了我这个错误
【发布时间】:2021-12-28 05:22:41
【问题描述】:

#store/admin.py

@admin.register(models.Product)
class ProductView(admin.ModelAdmin):
    list_display = ['title', 'unit_price', 'inventory_status', 'collection_title',]
    list_editable = ['unit_price']
    list_per_page = 10
    list_select_related = ['collection']

#store/models.py

class Collection(models.Model):
    title = models.CharField(max_length=255)
    featured_product = models.ForeignKey(
        'Product', on_delete=models.SET_NULL, null=True, related_name='+')

    class Meta:
        ordering = ['title']
    '''
    def __str__(self) -> str:
        return self.title
    '''


class Product(models.Model):
    title = models.CharField(max_length=255)
    slug = models.SlugField()
    description = models.TextField()
    unit_price = models.DecimalField(max_digits=6, decimal_places=2)
    inventory = models.IntegerField()
    last_update = models.DateTimeField(auto_now=True)
    collection = models.ForeignKey(Collection, on_delete=models.PROTECT)
    promotions = models.ManyToManyField(Promotion)

#Error 我得到了: SystemCheckError

PS - 我知道我可以直接在 list_display 中使用“collection”,因为它已经是我的产品模型中的一个字段,但我想使用 list_select_related 预加载相关字段/表并在 list_display 中使用“collection_title”。请帮忙。谢谢。

错误: : (admin.E108) 'list_display[3]' 的值是指 'col lection_title',它不是可调用的,不是“ProductView”的属性,也不是“store.Product”上的属性或方法。

【问题讨论】:

    标签: python django django-models django-admin


    【解决方案1】:

    我认为你错了,据我所知list_select_related 是为了减少你的查询,但你的错误是别的,这里说“l​​ist_display [3]”指的是colection_title,这不是模型的属性或可调用方法 Product 或 ProductView 类。

    django validate this items(list_display) 在下面的链接中,你可以看到 validate 函数(_check_list_display): https://github.com/django/django/blob/950d697b95e66deb3155896e0b619859693bc8c6/django/contrib/admin/checks.py#L732

    如果您想访问其他模型中的相关字段,您可以在您的 ProductView 链接中创建一个函数:

    class ProductView(admin.ModelAdmin):
        list_display = ['title', 'unit_price', 'inventory_status', 'collection_title',]
        list_editable = ['unit_price']
        list_per_page = 10
        list_select_related = ['collection']
    
        def  collection_title(self, obj):
             return obj.collection.title
    

    【讨论】:

    • 好的。感谢你的回答。对此,我真的非常感激。如果我使用 list_select_related 预加载,我认为我不需要该 collection_title 函数是错误的。但你已经向我展示了什么是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 2022-01-20
    相关资源
    最近更新 更多