试图在django模型保存到数据库之前验证它。使用POST api在特定模型中创建模型对象

试图在django模型保存到数据库之前验证它。使用POST api在特定模型中创建模型对象,django,django-models,django-rest-framework,Django,Django Models,Django Rest Framework,我试图实现一个合规小组可以属于一个合规法律,但可以有任意数量的符合该法律的合规性,但到目前为止,它还可以从其他合规法律创建合规小组。您可以尝试此代码 从rest_framework.exceptions导入ValidationError 类符合性GroupSerializer序列化程序.ModelSerializer: 类元: 模型=合规性组 字段= 身份证件 名称 遵守法律, 顺从 创建于, 修改"关于",, 只读字段=已创建,已修改 def验证自身,属性: 合规性法律=属性。获取“合规性法律

我试图实现一个合规小组可以属于一个合规法律,但可以有任意数量的符合该法律的合规性,但到目前为止,它还可以从其他合规法律创建合规小组。

您可以尝试此代码

从rest_framework.exceptions导入ValidationError 类符合性GroupSerializer序列化程序.ModelSerializer: 类元: 模型=合规性组 字段= 身份证件 名称 遵守法律, 顺从 创建于, 修改"关于",, 只读字段=已创建,已修改 def验证自身,属性: 合规性法律=属性。获取“合规性法律” 合规性=属性。获取“合规性” 在这里说明你的逻辑 对于comp合规性: 如果公司遵守法律!=遵守法律: 引发验证错误{ “合规性”:所有合规性都应成为合规性法律的一部分 } 如果一切正常,则返回attrs,因为此方法应返回attrs或引发错误 返回属性
您能否从您的场景中添加更多的细节,如视图和表单?@Chris在获取合规性的行中添加了视图和序列化:它不应该是合规性(compliance_law__id,即2'__')吗?我不是DRF方面的专家,但据我所知,在使用序列化程序时不会调用clean_fields验证方法。所有验证都应该在序列化程序中完成。问题是我不知道如何为M2M字段编写逻辑,这就是为什么在实现此逻辑时出现问题的原因我已经编辑了我的答案,请再次检查,只是针对投诉进行迭代,如果没有引发错误,请检查每一个是否符合法律,如果我误解了你想要什么,请向我说明清楚,这样我可以帮助你。你也可以使用ORM而不是循环>>如果complicence.count!=compliance.filtercompliance\u law=compliance\u law.count:在此处引发验证错误。我认为这是更好的尝试,并告诉我,如果它为你工作,我会编辑我的答案再次与此你的两个解决方案都不工作。仍在根据不同的法规创建组。我试图实现的是,当我创建一个c_组时,它将选择一个合规性法律,然后它将选择合规性这里是一个陷阱,它只能选择那些根据所选合规性法律创建的合规性,否则它将引发验证错误。让我们来看看。
class ComplianceLaw(TimeStampModel):
    name = models.CharField(verbose_name=_("Name"), max_length=100)
    slug = models.SlugField(max_length=40)


class Compliance(TimeStampModel):
    name = models.CharField(verbose_name=_("Name"), max_length=1000)
    compliance_law = models.ForeignKey(
        verbose_name=_("Compliance Law"), to=ComplianceLaw, on_delete=models.CASCADE
    )

class ComplianceGroup(TimeStampModel):
    name = models.CharField(verbose_name=_("Name"), max_length=1000)
    compliance_law = models.ForeignKey(
        verbose_name=_("Category Law"), to=ComplianceLaw, on_delete=models.CASCADE
    )
    compliance = models.ManyToManyField(verbose_name=_("Compliance"), to=Compliance)

    def clean_fields(self, exclude=None):
        super().clean_fields(exclude=exclude)
        compliances = self.compliance.all().values_list("compliance_law_id", "id")
        errors = []
        for compliance, oid in compliances:
            if compliance != self.compliance_law_id:
                errors.append("{} is not a valid group element.".format(oid))
        if errors:
            raise ValidationError({self.compliance.name: errors})
# serializers.py
class ComplianceGroupSerializer(serializers.ModelSerializer):
    class Meta:
        model = ComplianceGroup
        fields = (
            "id",
            "name",
            "compliance_law",
            "compliance",
            "created_on",
            "modified_on",
        )
        read_only_fields = ("created_on", "modified_on")


# views.py
class ComplianceGroupListCreateView(generics.ListCreateAPIView):
    permission_classes = (IsAdmin,)
    queryset = ComplianceGroup.objects.all().order_by("id")
    serializer_class = ComplianceGroupSerializer