2014-12-23 4 views
0

Как получить все элементы, связанные с частью через самореферентный 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) 
+1

На ваш вопрос? – nima

+0

Как скорректировать мое представление, чтобы получить QuerySet связанных элементов с переменной 'product'? – pyrodney

+0

Вы уже не сделали этого? Что не так с кодом, который у вас есть? Хотя еще раз я вижу, что вы используете разные имена в представлении, а шаблон - 'part_list' vs' part_items'. * Пожалуйста, * прекратите использование 'locals', явно передайте свой контекст dict и убедитесь, что вы используете правильные имена в своем шаблоне. –

ответ

0

я смог найти ответ на мой собственный вопрос с помощью Розмана. part_list линии должна быть следующей:

# views.py 

part_list = product.buildpart.all().order_by('family__type') 

После Роземана указывал на переменное несовпадение имен я сделал вверх QuerySet, как это имело смысл для меня, и это работает!

Смежные вопросы