我正在使用 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 关系。我不确定我所做的方式是否正确,尤其是更新方法,因为我正在清除所有现有关系以添加新关系,所以也许这就是问题所在,但我不确定正确的方法是什么处理这是,所以请指导我!
感谢所有帮助,谢谢!