1

我正在使用 django-simple-history 跟踪对我的字段的更改,从我所见,似乎 django-simple-history 不跟踪对 M2M 字段的更改。我尝试为 M2M 字段引入中间模型,然后在该中间模型中附加一个 HistoricalRecords() 字段,但似乎没有用,除非我错误地使用了 django-simple-history。似乎每当我在 M2M 字段中添加新关系(使用“通过”)时,都会在中间模型中创建一个新实例,将外键关系引用到具有 M2M 关系的两个模型,并且每当删除一个关系时,对应的中间模型中的实例将被删除。如果是这样的话,如何通过中间模型跟踪 M2M 字段的变化?因为只要实例作为关系被删除,它就会被删除,这将导致跟踪不存在,因为该实例不再存在。我是 django-simple-history 的新手,所以如果我错过或误解了什么,请指导我,谢谢大家!

这是我的代码:

模型.py

class CustomerInformation(models.Model):
    customer_id = models.AutoField(primary_key=True)
    customer_name = models.CharField(max_length=100)
    history = HistoricalRecords()

class SalesProject(models.Model):
    sales_project_id = models.AutoField(primary_key=True)
    sales_project_name = models.CharField(max_length=100)
    customer_information = models.ManyToManyField('CustomerInformation', through='Project_Customer')
    history = HistoricalRecords()

class Project_Customer(models.Model):
    project = models.ForeignKey('SalesProject', on_delete=models.SET_NULL, null=True)
    customer = models.ForeignKey('CustomerInformation', on_delete=models.SET_NULL, null=True)
    history = HistoricalRecords()

序列化程序.py

class ProjectCustomerSerializer(serializers.ModelSerializer):
    class Meta:
        model = ProjectCustomer
        fields = ('id')

class SalesProjectSerializer(serializers.ModelSerializer):
    customer_information = serializers.PrimaryKeyRelatedField(many=True, queryset=CustomerInformation.objects.all())

    class Meta:
        model = SalesProject
        fields = '__all__'

    def create(self, validated_data):
        customers = validated_data.pop('customer_information')
        project = SalesProject.objects.create(**validated_data)
        for customer in customers:
            project.customer_information.add(customer)
        return project

    def update(self, instance, validated_data):
        customers = validated_data.pop('customer_information')
        instance = super().update(instance, validated_data)
        instance.customer_information.clear()
        for customer in customers:
            instance.customer_information.add(customer)
        return instance

视图.py

class SalesProjectViewSet(viewsets.ModelViewSet):
     serializer_class = SalesProjectSerializer
     queryset = SalesProject.objects.all()

我在这里做错什么了吗?我不太清楚我应该如何处理中间模型的创建和更新与基础模型(SalesProject)的关系,所以我在SalesProject的ModelSerializer的创建和更新方法中手动处理,这样当我创建并更新一个 SalesProject 实例,我可以在 1 次调用中更新和创建中间模型 (ProjectCustomer) 中的 M2M 关系。我不确定我所做的方式是否正确,尤其是更新方法,因为我正在清除所有现有关系以添加新关系,所以也许这就是问题所在,但我不确定正确的方法是什么处理这是,所以请指导我!

感谢所有帮助,谢谢!

4

0 回答 0