Django list_select_related дает мне такую ошибку
#app/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']
#app/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)
#Ошибка, которую я получил: SystemCheckError
PS - Я знаю, что могу использовать 'collection' в list_display напрямую, так как это уже поле в моей модели продукта, но я хочу предварительно загрузить связанное поле/таблицу с помощью list_select_related и использовать 'collection_title' в list_display. Пожалуйста, помогите. Спасибо.
ERRORS: <class 'store.admin.ProductView'>: (admin.E108) Значение 'list_display[3]' ссылается на 'col lection_title", который не является вызываемой переменной, атрибутом 'ProductView', атрибутом или методом 'store.Product'.
Я думаю, что вы ошибаетесь, насколько я знаю list_select_related
это сокращение запроса, но ваша ошибка в другом, здесь говорится, что "list_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 this:
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