From c2336b53205aad84fc0635bf720d85e840f05e8f Mon Sep 17 00:00:00 2001 From: Krystof Rehacek Date: Fri, 21 Jun 2019 23:40:27 +0200 Subject: [PATCH] added test for the issue 6751 --- tests/test_model_serializer.py | 42 ++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/tests/test_model_serializer.py b/tests/test_model_serializer.py index cc5ad3aad..ae320927c 100644 --- a/tests/test_model_serializer.py +++ b/tests/test_model_serializer.py @@ -18,6 +18,8 @@ from django.core.validators import ( MaxValueValidator, MinLengthValidator, MinValueValidator ) from django.db import models +from django.db.models.signals import m2m_changed +from django.dispatch import receiver from django.test import TestCase from rest_framework import serializers @@ -1259,3 +1261,43 @@ class Issue6110Test(TestCase): msginitial = ('Got a `TypeError` when calling `Issue6110TestModel.all_objects.create()`.') with self.assertRaisesMessage(TypeError, msginitial): Issue6110ModelSerializer().create({'wrong_param': 'wrong_param'}) + + +class Issue6751Model(models.Model): + many_to_many = models.ManyToManyField(ManyToManyTargetModel, related_name='+') + char_field = models.CharField(max_length=100) + char_field2 = models.CharField(max_length=100) + + +@receiver(m2m_changed, sender=Issue6751Model.many_to_many.through) +def process_issue6751model_m2m_changed(action, instance, **_): + if action == 'post_add': + instance.char_field = 'value changed by signal' + instance.save() + + +class Issue6751Test(TestCase): + def test_model_serializer_save_m2m_after_instance(self): + class TestSerializer(serializers.ModelSerializer): + class Meta: + model = Issue6751Model + fields = ( + 'many_to_many', + 'char_field', + ) + + instance = Issue6751Model.objects.create(char_field='initial value') + m2m_target = ManyToManyTargetModel.objects.create(name='target') + + serializer = TestSerializer( + instance=instance, + data={ + 'many_to_many': (m2m_target.id,), + 'char_field': 'will be changed by signal', + } + ) + + serializer.is_valid() + serializer.save() + + self.assertEqual(instance.char_field, 'value changed by signal')