Свойство модели Django не работает - Django

Я столкнулся с проблемой при попытке определить свойство в модели Django и получить к ним доступ. У меня есть 2 модели, первая - продукт, вторая - атрибуты продукта. Атрибуты продукта имеют несколько полей, таких как Цвет и Бренд. Я хочу создать свойства для получения бренда и цвета продукта для использования в шаблоне и фильтрации (django-filter), но свойства в модели не дают ожидаемого результата. Пожалуйста, приведите ниже коды и замечания для справки и помощи.

Модель продукта :

class Product(models.Model):
measurement_choices = (('Liter', 'Liter'), ('Kilogram', 'Kilogram'), ('Cloth', 'Cloth'), ('Shoe', 'Shoe'))
name = models.CharField(max_length=200)
sku = models.CharField(max_length=30, null=True)
stock = models.CharField(max_length=10, null=True)
measurement = models.CharField(choices=measurement_choices, max_length=20, null=True)
description = models.CharField(max_length=10000)
price = models.DecimalField(max_digits=7, decimal_places=2)
discounted_price = models.DecimalField(max_digits=7, decimal_places=2, null=True, blank=True)
image = models.ImageField(upload_to='product/images', default='product.png', null=True, blank=True)
image_one = models.ImageField(upload_to='product/images', null=True, blank=True)
image_two = models.ImageField(upload_to='product/images', null=True, blank=True)
image_three = models.ImageField(upload_to='product/images', null=True, blank=True)
image_four = models.ImageField(upload_to='product/images', null=True, blank=True)
image_five = models.ImageField(upload_to='product/images', null=True, blank=True)
tags = models.ManyToManyField(Tags)
sub_category = models.ForeignKey(SubCategory, on_delete=models.SET_NULL, 
null=True,related_name='+')
status = models.CharField(max_length=20, choices=(('Active', 'Active'), ('Inactive', 
'Inactive')))
history = HistoricalRecords()

Свойство, которое я создал для получения названия бренда:

def p_brand(self):
    brand = ''
    all_attributes = self.productattribute_set.all()
    for att in all_attributes:
        brand = att.brand.title
        print(brand)
    return brand 

Это свойство возвращает следующий результат в представлении вместо названия бренда:

   <bound method Product.p_brand of <Product: 1:T-Shirt:Men>>
   <bound method Product.p_brand of <Product: 2:Shoe:Men>>
   <bound method Product.p_brand of <Product: 3:Book:Men>>

Модель атрибута продукта :

class ProductAttribute(models.Model):
      product = models.ForeignKey(Product, on_delete=models.CASCADE)
      brand = models.ForeignKey(Brand, on_delete=models.CASCADE, null=True, 
      blank=True)
     color = models.ForeignKey(Color, on_delete=models.CASCADE, null=True, 
      blank=True)
      size = models.ForeignKey(Size, on_delete=models.CASCADE, null=True, blank=True)
      price = models.PositiveIntegerField(default=0)
      offer = models.ForeignKey(Offer, on_delete=models.CASCADE, null=True, 
      blank=True)
      image = models.ImageField(upload_to="product_imgs/", null=True, blank=True)
      history = HistoricalRecords()

Я также пытался получить бренд в поле зрения с помощью нижеприведенного метода, который работает нормально.

for product in Product.objects.all():
    attr = product.productattribute_set.all()
    for att in attr:
    print(att.brand.title)

Вы не сделали его свойством, это простой метод. Вам нужно добавить декоратор @property [Python-doc]:

class Product(models.Model):
    # …
    
    @property  # ← property decorator
    def p_brand(self):
        return ', '.join(
            pa.brand.title
            for pa in self.productattribute_set.select_related('brand')
        )
Вернуться на верх