我有一个任务是在从DB和上下文之前收到它之后修改queryset。 我做下一个:
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
除ManyToMany Fields外,它的工作正常。如果我尝试设置无值,我会收到错误:
'NoneType' object is not iterable
我需要分配什么?
史前 我需要为特定用户限制模型中特定字段项的值可见性。 我创建了包含用户,模型对象和wich字段的引用的中间模型。我真的不知道如何通过查询集实现它,但我的动态修改片段效果很好
答案 0 :(得分:-1)
重置clear
字段的方法是使用value = getattr(product, fields[0], None)
if value and isinstance(value, ManyToManyField): value.clear()
。 documentation
div
答案 1 :(得分:-1)
ManyToManyFields在引擎盖下表现出一些魔力。你不能简单地指定None
,因为它期望一个Iterable。您必须为ManyToManyFields分配一个空列表[]
,但这实际上是执行数据库查询,可能不是您想要的!
你可以尝试解决这个问题,但我只想构建一个你想要传递给模板的信息字典。
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