在当前模型

时间:2016-06-16 20:30:53

标签: python django

嗨,我是Django的新手。

  • 我有一个商店列表。每个商店都有品牌的产品。
  • 对于商店,我可以列出他们携带的品牌。
  • 对于一个品牌,我想列出带有该品牌的商店。

以下是我的模型(简化):

class Store(models.Model):
    company = models.CharField(max_length=256)
    brands = models.ManyToManyField('Brand',related_name='brand')

class Brand(models.Model):
    company = models.CharField(max_length=256)

以下是我对模板的看法:

def brand_detail_slug(request, slug):
    brand = Brand.objects.get(slug=slug)
    return render(request, 'storefinder/brand_detail.html', {'brand': brand})

我可以在我看来成功检索品牌信息:

{% for p in brand.product_types.all %}
    <li>{{ p }}</li>
{% endfor %}

但我不知道如何为商店做这件事,因为它并没有在品牌中真正定义。这是一个单独的模型....这是我感到困惑的地方。

谢谢!

2 个答案:

答案 0 :(得分:3)

多对多关系是相互的。所以商店可以从品牌看到,反之亦然。

您可以使用prefetch_related来最小化执行此操作所需的数据库查询数量:

brands = Brand.objects.filter(slug=slug).prefetch_related('stores')
stores = [b.stores.all() for b in brands] # all related stores to those brands

<强>更新

related_name未正确定义。使用包含M2M关系的模型的名称:

brands = models.ManyToManyField('Brand', related_name='stores')

答案 1 :(得分:-1)

我想我已经在网上找到了一个解决方案,不确定它是否完美,但它对我有用:

class Store(models.Model):
    brands = models.ManyToManyField('Brand', blank=True)

class Brand(models.Model):
    stores = models.ManyToManyField('Store', through=Store.brands.through, blank=True)