使用具有多个外键的 Django 2.2 模型,如何访问和过滤数据?
Using Django 2.2 Models with multiple foriegn keys ,how can one access and filter data?
我有这个型号
产品
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')
我有两个外键,一个是 User Class 用于卖家信息,另一个是 Categories with Model名称 Cat1。
对于 Same,我有相关的名称 catlevel1 和 sellers。
我在 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_useruser
访问所有产品。这里sellers
是外键的关联名seller
我想使用两个外键获取数据,seller
in 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=category)
我知道我必须调整变量的名称,但错误是语法无效。
Follow the answer to this question> That is the correct way.
{% 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 过滤器循环选择的产品是否具有与当前 [=20] 相同的 类别名称 =]选择类别.
Here categories hold current category and prod hold the selected product.
{% if prod.cat_1.name == categories.name %}
上面一行检查名称。
然后打印if里面的信息。
{%endif%}
if 用于结束 if 标签。
您的模板应该实际呈现响应。你在回答中所做的方式是不可行的。您只是隐藏了额外的结果。相反,您应该查询所需的结果。
您可以 user.sellers.select_related('cat_1').filter(cat_1__categories=category)
并将结果传递给您的模板。但是您需要在视图中执行此查询。那是因为它会给你更多的控制权,如果你想实现任何分页或任何额外的功能,那将很容易做到。
我有这个型号
产品
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')
我有两个外键,一个是 User Class 用于卖家信息,另一个是 Categories with Model名称 Cat1。 对于 Same,我有相关的名称 catlevel1 和 sellers。 我在 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_useruser
访问所有产品。这里sellers
是外键的关联名seller
我想使用两个外键获取数据,seller
in 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=category) 我知道我必须调整变量的名称,但错误是语法无效。
Follow the answer to this question> That is the correct way.
{% 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 过滤器循环选择的产品是否具有与当前 [=20] 相同的 类别名称 =]选择类别.
Here categories hold current category and prod hold the selected product.
{% if prod.cat_1.name == categories.name %}
上面一行检查名称。
然后打印if里面的信息。
{%endif%}
if 用于结束 if 标签。
您的模板应该实际呈现响应。你在回答中所做的方式是不可行的。您只是隐藏了额外的结果。相反,您应该查询所需的结果。
您可以 user.sellers.select_related('cat_1').filter(cat_1__categories=category)
并将结果传递给您的模板。但是您需要在视图中执行此查询。那是因为它会给你更多的控制权,如果你想实现任何分页或任何额外的功能,那将很容易做到。