Я использую django -simple-history для отслеживания изменений в моих полях, и из того, что я вижу, похоже, что django -simple-history не отслеживает изменения в полях M2M. Я попытался ввести промежуточную модель для полей M2M, а затем прикрепить поле HistoricalRecords () в этой промежуточной модели, но похоже, что в этом нет никакого смысла, если только я не использую django -simple-history неправильно. Похоже, что всякий раз, когда я добавляю новое отношение в поле M2M (с «через»), в промежуточной модели создается новый экземпляр, ссылающийся на отношения внешнего ключа к двум моделям с отношениями M2M, и всякий раз, когда отношение удаляется, соответствующее экземпляр в промежуточной модели будет удален. Если это так, как я могу отслеживать изменения полей M2M через промежуточную модель? Поскольку экземпляр будет удаляться всякий раз, когда он будет удален как отношение, что приведет к тому, что отслеживание не будет существовать, поскольку этот экземпляр больше не существует. Я новичок в django -simple-history, так что помогите мне, если я что-то пропустил или неправильно понял, спасибо всем!
Вот мой код:
models.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()
serializers.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
views.py
class SalesProjectViewSet(viewsets.ModelViewSet):
serializer_class = SalesProjectSerializer
queryset = SalesProject.objects.all()
Я здесь что-то не так делаю? Я не слишком уверен, как я должен обрабатывать создание промежуточной модели и обновление отношений вместе с базовой моделью (SalesProject), поэтому я обработал это вручную в методах создания и обновления ModelSerializer из SalesProject, чтобы при создании и обновить экземпляр SalesProject, я могу обновлять и создавать отношения M2M в промежуточной модели (ProjectCustomer) за один вызов. Я не уверен, что то, что я сделал, верен, особенно метод обновления, поскольку я очищаю все существующие отношения, чтобы добавить новые, так что, возможно, именно здесь возникает проблема, но я не уверен, какой правильный способ справиться с этим, так что направляйте меня!
Любая помощь приветствуется, всем спасибо!