在编写过滤器查询时需要一些帮助。
我有以下型号:
class Product:
pid
name
class WishList:
user
items = models.ManyToManyFields(Product)
class Stock:
storeid
product = models.ForeignKey(Product)
aisle
segment
我需要:
获取当前登录的用户
从用户的愿望清单中获取产品
在“库存”中搜索那些作为参数传递的特定StoreID的产品,并将它们连同其过道一起显示
这就是我所做的:
user = request.user
wish_list = get_object_or_404(WishList, user=user)
list_items = wish_list.items.all()
store_stocks = Stock.objects.filter(storeid=(passed StoreID))
list_stocks store_stocks.filter(store_stocks.pid=list_items.pid)
但是它不起作用,我需要一些帮助。
我收到以下错误消息:
list_stocks = store_stocks.filter(store_stocks.pid=list_items.pid)
|
SyntaxError: keyword can't be an expression
答案 0 :(得分:1)
您不能写:
filter(store_stocks.pid=list_items.pid)
因为参数名称store_stocks.pid
无效。
我们可以在单个查询中执行以下操作:
from django.db.models import F
products = Product.objects.filter(
wishlist__user=request.user,
stock__storeid=store_id
).annotate(
aisle=F('stock__aisle')
)
这将导致一个查询集,其中包含Product
个具有额外属性aisle
的属性,该属性是给定 {{1}的aisle
的{{1}} }} 。因此,这将更方便(可能)呈现Stock
和相应的store_id
。
请注意,用户可以具有多个愿望清单,因此在这种情况下,我们可以得到所有愿望清单的所有产品。如果某项出现在多个愿望清单中,则会被多次列出 。
因此,此查询将产生两个Product
:一个带有aisle
表,另一个带有JOIN
表。
答案 1 :(得分:1)
您可以通过以下方式实现此目标:
list_items = wish_list.items.all()
list_stocks = Stock.objects.filter(storeid=(passed StoreID), product__in=list_items)