Python 如何分配给多个无对象?
我有一个任务要修改queryset,在a从DB接收到它之后,在上下文之前。 我做下一步:Python 如何分配给多个无对象?,python,django,django-models,Python,Django,Django Models,我有一个任务要修改queryset,在a从DB接收到它之后,在上下文之前。 我做下一步: products = list(qs) #create a copy of qs to avoid modifiyng in DB for product in products: access_table = FieldAccess.objects.filter(user=user, product=product.pk).values_list('access', flat=True)
products = list(qs) #create a copy of qs to avoid modifiyng in DB
for product in products:
access_table = FieldAccess.objects.filter(user=user, product=product.pk).values_list('access', flat=True)
fields = [Choices.objects.filter(pk=item).values_list('field_name', flat=True) for item in access_table
if not access_table[0] == None]
for field in fields:
setattr(product, field[0], None) #assign a new value to particular field of object
return products
除了许多领域外,它运行良好。如果尝试设置“无”值,则会出现错误:
'NoneType' object is not iterable
我必须分配什么
史前史
我需要为特定用户限制模型中特定字段项的值可见性。
我创建了一个中间模型,其中包含对用户、模型对象和应该隐藏的字段的引用。我真的不知道如何通过queryset实现这一点,但我的即时修改代码片段运行良好重置
ManyToManyField
字段的方法是使用clear
许多场地在引擎盖下表演一些魔术。您不能简单地分配
None
,因为它需要一个Iterable。您必须将空列表[]
分配给多个字段,但这实际上执行数据库查询,可能不是您想要的
您可以尝试解决这个问题,但我只需要构建一个字典,其中包含您实际希望传递给模板的信息
products = []
for product in qs:
access_table = FieldAccess.objects.filter(user=user, product=product.pk).values_list('access', flat=True)
fields = [Choices.objects.filter(pk=item).values_list('field_name', flat=True) for item in access_table
if not access_table[0] == None]
products.append({field[0]: None for field in fields})
return products
您试图在循环中查询数据库的做法可能并不正确。如果你能详细解释你的目标是什么……这实际上修改了DB,这不是作者的意图。请参阅代码中的第一条注释。尽管如此,实际上并不清楚您实际上想要实现什么,但正如@e4c5所评论的,您的方法似乎有问题。也许你可以用更多的上下文来扩展你的问题,我们可以找到一个更好的解决方案。你永远不会在ManyToManyField本身上迭代。您在关系字段上迭代了
.all
或.filter
调用。看起来我们都搞错了。至少对于v1.9,分配[]
相当于清除
@ps您在这两个帐户上都是正确的。我现在更新我的答案
products = []
for product in qs:
access_table = FieldAccess.objects.filter(user=user, product=product.pk).values_list('access', flat=True)
fields = [Choices.objects.filter(pk=item).values_list('field_name', flat=True) for item in access_table
if not access_table[0] == None]
products.append({field[0]: None for field in fields})
return products