Получать данные о детях с родителями в запросах Django - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть две модели Product и ProductBundle.ProductBundle имеет внешний ключ Product Model.Как я могу получить доступ к списку всех продуктов с помощью там productbundle.

class Product(models.Model):
    title = models.CharField(verbose_name="Product Title", max_length=500)

class ProductBundle(models.Model):
    product = models.ForeignKey(Product,on_delete=models.CASCADE,related_name="product")
    bundle_product = models.ForeignKey(Product,on_delete=models.CASCADE,related_name="bundle_product",default="")
    quantity = models.IntegerField(default="1")

Я хочу получить все товары с этими там идентификаторами productbundle, такими как parent to childs, в одной переменной.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

У вас уже есть ProductBundle объекты как Ссылка на связанные объекты для каждого Product.

Если вы делаете products = Product.objects.all(), вы можете получить доступ к каждому продуктусвязывая, выполняя:

for product in products:
    product_bundles = product.productbundle_set.all()

Редактирование на основе комментария:

Если вы хотите показать все товары с их связками в шаблоне, вы можете сделать почти то же самое,В вашем view получите все продукты в переменной, например products = Product.objects.all() и передайте его в шаблон.Предполагая, что ваша переменная называется products, вы можете сделать:

{% for product in products %}
    <h1>{{product.title}}</h1>
    <h1>Bundles:</h1>
    {% for bundle in product.productbundle_set.all %}
        <h2>{{bundle.quantity}}</h2>
    {% endfor %}
{% endfor %}
0 голосов
/ 11 февраля 2019

Вы должны изменить related_name из product внутри ProductBundle на что-то вроде bundles, а затем вы можете перейти product.bundles.all(), чтобы получить доступ ко всем ProductBundle, связанным с Product

изменить, чтобы отфильтровать все продукты, если они имеют ProductBundle

, если вы используете bundles в качестве related_name: Product.objects.filter(bundles__isnull=False).distinct()

...