Djnago отношения вложенности "related_name"

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

class Category(models.Model):
    ...

class Product(models.Model):
    category = models.ForeignKey(Category, db_column="id", on_delete=models.CASCADE, related_name="products")
    ...

class Size(models.Model):
    product = models.ForeignKey(Product, db_column="id", on_delete=models.CASCADE, related_name="sizes")
    ...

И мой код в работе

def adjust_sizes(self, category: Category) -> None:
    for size in category.products.sizes.all():
        # rest of my function

Но когда я пытался запустить эту функцию, я получил ошибку:

*** AttributeError: 'RelatedManager' object has no attribute 'sizes'

Я хотел, чтобы это выполнялось в одном цикле, может кто-нибудь помочь мне, как это сделать?

Вы не можете получить доступ к менеджеру поверх менеджера. В этом случае запрос выполняется в обратном порядке, так:

def adjust_sizes(self, category: Category) -> None:
    for size in Size.objects.filter(product__category=category):
        # rest of my function
        pass

Вполне вероятно, что использование db_column='id' является, однако, не хорошей идеей, поскольку оно может/будет конфликтовать со столбцом базы данных для первичного ключа.

lass Category(models.Model): ...

class Product(models.Model): category = models.ForeignKey(Category, db_column="id", on_delete=models.CASCADE, related_name="products") ...

class Size(models.Model): product = models.ForeignKey(Product, db_column="id", on_delete=models.CASCADE, related_name="sizes") ...

Вернуться на верх