Skip to content

Commit 4cc08d8

Browse files
committed
Added to demonstrate that messages with a nullable profile foreign key, i.e. s, are not deleted when they are removed from a profile.
1 parent b655fda commit 4cc08d8

File tree

3 files changed

+76
-2
lines changed

3 files changed

+76
-2
lines changed

tests/models.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,15 +65,25 @@ class CustomPK(models.Model):
6565
)
6666

6767

68-
class Message(models.Model):
68+
class AbstractMessage(models.Model):
6969
id = models.UUIDField(
7070
primary_key=True,
7171
default=uuid.uuid4,
7272
editable=False
7373
)
74-
profile = models.ForeignKey(Profile, on_delete=models.CASCADE)
7574
message = models.CharField(max_length=100)
7675

76+
class Meta:
77+
abstract = True
78+
79+
80+
class Message(AbstractMessage):
81+
profile = models.ForeignKey(Profile, on_delete=models.CASCADE)
82+
83+
84+
class PersistentMessage(AbstractMessage):
85+
profile = models.ForeignKey(Profile, on_delete=models.CASCADE, null=True)
86+
7787

7888
class AnotherProfile(models.Model):
7989
sites = models.ManyToManyField(Site)

tests/serializers.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@ class Meta:
2121
fields = ('pk', 'message',)
2222

2323

24+
class PersistentMessageSerializer(serializers.ModelSerializer):
25+
26+
class Meta:
27+
model = models.PersistentMessage
28+
fields = ('pk', 'message',)
29+
30+
2431
class SiteSerializer(serializers.ModelSerializer):
2532
url = serializers.CharField()
2633

@@ -54,6 +61,13 @@ class Meta:
5461
fields = ('pk', 'sites', 'avatars', 'access_key', 'message_set',)
5562

5663

64+
class PersistentProfileSerializer(ProfileSerializer):
65+
message_set = PersistentMessageSerializer(many=True)
66+
67+
class Meta(ProfileSerializer.Meta):
68+
pass
69+
70+
5771
class UserSerializer(WritableNestedModelSerializer):
5872
# Reverse OneToOne relation
5973
profile = ProfileSerializer(required=False, allow_null=True)
@@ -64,6 +78,13 @@ class Meta:
6478
fields = ('pk', 'profile', 'username', 'user_avatar')
6579

6680

81+
class PersistentUserSerializer(WritableNestedModelSerializer):
82+
profile = PersistentProfileSerializer(required=False, allow_null=True)
83+
84+
class Meta(UserSerializer.Meta):
85+
pass
86+
87+
6788
class CustomSerializer(UserSerializer):
6889
# Simulate having non-modelfield information on the serializer
6990
custom_field = serializers.CharField()

tests/test_writable_nested_model_serializer.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,49 @@ def test_update(self):
224224
# Sites shouldn't be deleted either as it is M2M
225225
self.assertEqual(models.Site.objects.count(), 3)
226226

227+
def test_update_no_delete_if_null_is_false(self):
228+
serializer = serializers.UserSerializer(data=self.get_initial_data())
229+
serializer.is_valid(raise_exception=True)
230+
user = serializer.save()
231+
232+
# Check instances count
233+
self.assertEqual(models.User.objects.count(), 1)
234+
self.assertEqual(models.Message.objects.count(), 3)
235+
236+
# Update
237+
user_pk = user.pk
238+
profile_pk = user.profile.pk
239+
240+
serializer = serializers.PersistentUserSerializer(
241+
data={
242+
'pk': user_pk,
243+
'username': 'new',
244+
'profile': {
245+
'pk': profile_pk,
246+
'access_key': None,
247+
'sites': [
248+
{
249+
'url': 'http://new-site.com',
250+
},
251+
],
252+
'avatars': [
253+
],
254+
'message_set': [
255+
],
256+
},
257+
},
258+
instance=user,
259+
)
260+
261+
serializer.is_valid(raise_exception=True)
262+
user = serializer.save()
263+
user.refresh_from_db()
264+
265+
# Check instances count
266+
self.assertEqual(models.User.objects.count(), 1)
267+
self.assertEqual(models.Avatar.objects.count(), 0)
268+
self.assertEqual(models.Message.objects.count(), 3)
269+
227270
def test_update_reverse_one_to_one_without_pk(self):
228271
serializer = serializers.UserSerializer(data=self.get_initial_data())
229272
serializer.is_valid(raise_exception=True)

0 commit comments

Comments
 (0)