Django Простая история - Отслеживание изменений поля M2M (с «до») - PullRequest
0 голосов
/ 17 июня 2020

Я использую 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) за один вызов. Я не уверен, что то, что я сделал, верен, особенно метод обновления, поскольку я очищаю все существующие отношения, чтобы добавить новые, так что, возможно, именно здесь возникает проблема, но я не уверен, какой правильный способ справиться с этим, так что направляйте меня!

Любая помощь приветствуется, всем спасибо!

...