首页 > 解决方案 > Django - 禁止直接分配到多对多集合的前端

问题描述

我的项目中有这个类:

class ManejoEventoSanitario(models.Model):
   id_evento_sanitario = models.AutoField(primary_key=True)
   id_tipo_evento = models.ForeignKey(TipoEvento, on_delete=models.PROTECT)   
   descricao = models.CharField(max_length=90, blank=True, null=True)
   dt_evento_sanitario = models.DateField(blank=True, null=True)
   dt_prox_evento = models.DateField(blank=True, null=True)
   responsavel = models.ForeignKey(Pessoa, on_delete=models.PROTECT)   
   animais = models.ManyToManyField(Animal)
   produtos = models.ManyToManyField(DoseProduto)

   objects = models.Manager()

我的 ._views 中有这个帖子端点:

class ApiEventoSanitarioAnimal(APIView):
def post(self, request, format=None):
    data_evento = request.POST['data_evento']
    tipo_evento = request.POST['tipo_evento']
    responsavel = request.POST['responsavel']
    descricao = request.POST['descricao']
    data_proximo_evento = request.POST['data_proximo_evento']
    animais_json = jsonpickle.decode(request.POST['animais'])
    produtos_json = jsonpickle.decode(request.POST['produtos'])

    tipo_evento = get_object_or_404(TipoEvento, id_tipo_evento=tipo_evento)
    responsavel = get_object_or_404(Pessoa, id_pessoa=responsavel)

    animais = set()
    for animal_json_id in animais_json:
        animal = get_object_or_404(Animal, id_animal=animal_json_id)
        animais.add(animal)

    dose_quantidade_produtos = set()
    for produto_json in produtos_json:
        produto = get_object_or_404(Produto, id_produto=produto_json['id'])
        unidade_medida = Unidade.objects.filter(descricao=produto_json['unidade']).first()
        dose_quantidade = produto_json['dose']

        dose_produto = DoseProduto()
        dose_produto.id_produto = produto
        dose_produto.id_unidade_medida = unidade_medida
        dose_produto.quantidade = dose_quantidade
        dose_produto.save()
        dose_quantidade_produtos.add(dose_produto)

    m_evento_sanitario = ManejoEventoSanitario()
    m_evento_sanitario.dt_evento_sanitario = data_evento
    m_evento_sanitario.id_tipo_evento = tipo_evento
    m_evento_sanitario.responsavel = responsavel
    m_evento_sanitario.descricao = descricao
    m_evento_sanitario.save()

    #Adiciono os animais e produtos ao evento sanitario cadastro
    m_evento_sanitario.animais = animais
    m_evento_sanitario.produtos = dose_quantidade_produtos
    m_evento_sanitario.save()

    return Response(status=status.HTTP_200_OK)

我想做的是:

但是当代码到达这部分时:

m_evento_sanitario.animais = animais
m_evento_sanitario.produtos = dose_quantidade_produtos
m_evento_sanitario.save()

它抛出这个错误:

TypeError: Direct assignment to the forward side of a many-to-many set is prohibited. Use animais.set() instead.

我也尝试过作为列表,但它不起作用。animais 和 dose_quantidades_produtos 已经是一个集合。

请问,我做错了什么?

标签: pythondjango

解决方案


没有理由将它们放在一组中。在这些循环之前移动创建m_evento_sanitario,然后对于每个循环而不是将其添加到集合中,将其直接添加到 m2m:

for animal_json_id in animais_json:
    animal = get_object_or_404(Animal, id_animal=animal_json_id)
    m_evento_sanitario.animais.add(animal)

同样对于produtos.


推荐阅读