Как получить все элементы, связанные с частью через самореферентный ManyToManyField? Как исправить мое мнение, чтобы получить part_list, чтобы содержать список всех деталей, связанных с «продуктом» и в порядке, указанном order_by?Django получение связанных элементов в self-referential ManyToManyField in view
# views.py
def productdetail(request, slug):
product = get_object_or_404(PartModel, slug=slug)
part_list = PartModel.objects.all().filter(buildpart__id=product.pk).order_by('family__type')
return render(request, 'productdetail.html', locals())
Вот шаблон:
# productdetail.html
<header>
<h1>'{{ product.name }}' Detail Page</h1>
</header>
<p>{{ product.name }}
<p>{{ product.slug }}
<p>{{ product.family }}
<p>{{ product.family.type }}
<p>{{ product.family.make }}
<p>${{ product.price }}
{% for part in part_items %}
<p>{{ part.name }}
{% endfor %}
Обратите внимание на модели PartModel держит наш инвентарь и его самосправочный BuildPart ManyToMany модели через поле buildpart:
class PartModel(models.Model):
family = models.ForeignKey(PartFamily)
name = models.CharField("Model Name", max_length=50, unique=True)
buildpart = models.ManyToManyField('self', through='BuildPart',
symmetrical=False, related_name='+')
class Build(models.Model):
build = models.ForeignKey(PartModel, related_name='+')
part = models.ForeignKey(PartModel, related_name='+')
quantity = models.PositiveSmallIntegerField(default=1)
class Meta:
abstract = True
unique_together = ('build', 'part')
def __unicode__(self):
return self.build.name + ' with ' + str(self.quantity) + ' * ' + \
self.part.family.make.name + ' ' + self.part.name
class BuildPart(Build):
pass
class Meta:
verbose_name = "Build Part"
Чтобы получить все в в правильном порядке с предложением order_by мы следуем за полем «family» в модель PartFamily:
class PartFamily(models.Model):
make = models.ForeignKey(PartMake)
type = models.ForeignKey(PartType)
name = models.CharField("Family Name", max_length=30,
unique=True)
slug = models.SlugField(unique=True)
И, наконец, мы получаем модель с полем «порядка», который мы хотим упорядочить соответствующие детали, PartType:
class PartType(models.Model):
name = models.CharField("Part Type", max_length=30, unique=True)
slug = models.SlugField(unique=True)
order = models.PositiveSmallIntegerField()
description = models.TextField(blank=True, null=True)
На ваш вопрос? – nima
Как скорректировать мое представление, чтобы получить QuerySet связанных элементов с переменной 'product'? – pyrodney
Вы уже не сделали этого? Что не так с кодом, который у вас есть? Хотя еще раз я вижу, что вы используете разные имена в представлении, а шаблон - 'part_list' vs' part_items'. * Пожалуйста, * прекратите использование 'locals', явно передайте свой контекст dict и убедитесь, что вы используете правильные имена в своем шаблоне. –