Используя модели Django 2.2 с несколькими внешними ключами, как можно получить доступ и отфильтровать данные? - PullRequest
0 голосов
/ 03 июля 2019

У меня есть эта модель

продуктов

class Product(models.Model):
    name = models.CharField(max_length=50)
    productId = models.AutoField(max_length=50,primary_key=True)
    productType = models.CharField(max_length=50)
    productPrice = models.PositiveIntegerField(default=0)
    matType = models.CharField(max_length=100,default='Use comma , to seperate multiple materials Ex. Cotton 90%, Spandex 10%') #Multiple Material divided by comma,mat1 is main material
    seller = models.ForeignKey(User, related_name='sellers',on_delete=models.CASCADE,default='NA')
    cat_1 = models.ForeignKey(Cat1,related_name='catlevel1',on_delete=models.CASCADE,default='NA')

У меня есть два иностранных ключа, один для Класс пользователя для информации о продавцеа другой - Категории с названием модели Cat1 .Для этого же у меня есть родственные имена catlevel1 и продавцы .Я использую этот код в HTML для доступа к продуктам, зарегистрированным в данный момент пользователем.


{% for prod in user.sellers.all %}

        {% for color in prod.colors.all %}
         {% for size in prod.sizes.all %}
        <tr>
          <td>{{ prod.name }}</td>
          <td>{{ prod.productPrice }}</td>
          <td>{{ prod.matType }}</td>
          <td>{{ color.colorMain }},{{ color.colorTrim }}</td>
          <td>{{ size.nameSize }}</td>
          <td>{{ size.quantity }}</td>
        </tr>
        {% endfor %}
      {% endfor %}
    {% endfor %}

Первый цикл (первая строка):

{% for prod in user.sellers.all %}

осуществляет доступ ко всемпродукты по current_user user.Здесь sellers является связанным именем внешнего ключа seller

Я хочу получить данные, используя оба внешних ключа, seller в User Class и categories в cat1.

Таким образом, основная цель - получить продукты текущего пользователя и текущей категории. Я искал в Интернете, но не смог найти никакого решения.Многие из решений датируются Django 1,3 дня и не работают в настоящее время.

Некоторые из них предлагают использовать select_related, но я не мог понять, как его использовать здесь.

ОБНОВЛЕНИЕ: Используемые модели:

class Cat1(models.Model):
    name = models.CharField(max_length=30)
    description = models.CharField(max_length = 100)

    def __str__(self):
        return self.name



class Product(models.Model):
    name = models.CharField(max_length=50)
    productId = models.AutoField(max_length=50,primary_key=True)
    productType = models.CharField(max_length=50)
    productPrice = models.PositiveIntegerField(default=0)
    matType = models.CharField(max_length=100,default='Use comma , to seperate multiple materials Ex. Cotton 90%, Spandex 10%') #Multiple Material divided by comma,mat1 is main material
    seller = models.ForeignKey(User, related_name='sellers',on_delete=models.CASCADE,default='NA')
    cat_1 = models.ForeignKey(Cat1,related_name='catlevel1',on_delete=models.CASCADE,default='NA')

Вид используется:

def cat_products(request,pk):
   categories = get_object_or_404(Cat1, pk=pk)
   colors = Color.objects.all()
   products = Product.objects.all()
   sizes = Size.objects.all()
   sellerproducts = user.sellers.select_related('cat_1')filter(cat_1__categories=category)
   user = request.user
   return render(request, 'products.html', {'categories':categories,'products':products,'colors':colors,'sizes':sizes,'user':user,'sellerproducts':sellerproducts})

Вот как я использую: user.sellers.select_related ('cat_1') filter (cat_1__categories)= категория) Я знаю, что мне нужно настроить имена переменных, но ошибка неверного синтаксиса.

Ответы [ 2 ]

1 голос
/ 03 июля 2019

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

Вы можете сделать user.sellers.select_related('cat_1').filter(cat_1__categories=category) и передать результат в свой шаблон.Но вам нужно выполнить этот запрос в представлении.Это потому, что это даст вам больше контроля, и если вы захотите реализовать какую-либо нумерацию страниц или любую дополнительную функцию, это будет легко сделать.

0 голосов
/ 03 июля 2019

Следуйте ответу на этот вопрос> Это правильный путь.

{% for prod in user.sellers.all %}
       {% if prod.cat_1.name == categories.name %}
         {% for color in prod.colors.all %}
         {% for size in prod.sizes.all %}
          <tr>
            <td>{{ prod.name }}</td>
            <td>{{ prod.productPrice }}</td>
            <td>{{ prod.matType }}</td>
            <td>{{ color.colorMain }},{{ color.colorTrim }}</td>
            <td>{{ size.nameSize }}</td>
            <td>{{ size.quantity }}</td>
          </tr> 
          {% endfor %}
         {% endfor %}
      {% endif %}
    {% endfor %}

Я использовал этот код для разделения данных. Использование блока if для проверки того, что продукт, выбранный в цикле фильтра current_user, использованном в первой строке, имеет то же имя категории , что и текущая выбранная категория .

Здесь категории содержат текущую категорию, а prod - выбранный продукт.

{% if prod.cat_1.name == categories.name %} Над строкой проверяет имя. а затем печатает информацию внутри, если. {%endif%} если используется для завершения тега if.

...