如何分配给ManytoMany None对象?

时间:2016-06-03 07:54:00

标签: python django django-models

我有一个任务是在从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字段的引用的中间模型。我真的不知道如何通过查询集实现它,但我的动态修改片段效果很好

2 个答案:

答案 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