Как очистить поле ManyToMany в запросе исправления?
Мои отношения ManyToMany не сбрасываются. Я делаю патч-запрос, который переводит в djrf's partial_update. Но после этого RecordUsersEntry
все еще имеет тех же пользователей, сохраненных в setup_entry
.
Я пробовал запрос put с полем и записью, и тогда отношения "многие ко многим" сбрасываются, но я хочу сбросить их с помощью запроса patch.
Может быть связано с: https://github.com/encode/django-rest-framework/issues/2883, однако я собираюсь использовать JSON-запросы и на данный момент меня волнует только то, как сделать этот тест зеленым.
Я написал следующий тест:
def test_entry_update(self):
self.setup_entry()
view = RecordUsersEntryViewSet.as_view(actions={'patch': 'partial_update'})
data = {
'users': []
}
request = self.factory.patch('', data=data)
force_authenticate(request, self.user)
response = view(request, pk=1)
self.assertEqual(response.status_code, 200)
entry = RecordUsersEntry.objects.first()
self.assertEqual(entry.users.all().count(), UserProfile.objects.none().count()) # <-- The test fails here
с
def setup_entry(self):
self.entry = RecordUsersEntry.objects.create(record=self.record, field=self.field)
self.entry.users.set(UserProfile.objects.all())
а модель выглядит следующим образом:
class RecordUsersEntry(RecordEntry):
record = models.ForeignKey(Record, on_delete=models.CASCADE, related_name='users_entries')
field = models.ForeignKey(RecordUsersField, related_name='entries', on_delete=models.PROTECT)
users = models.ManyToManyField(UserProfile, blank=True)
class Meta:
unique_together = ['record', 'field']
verbose_name = 'RecordUsersEntry'
verbose_name_plural = 'RecordUsersEntries'
def __str__(self):
return 'recordUsersEntry: {};'.format(self.pk)
Viewsets и Serializer только основные:
class RecordUsersEntryViewSet(mixins.CreateModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin,
GenericViewSet):
queryset = RecordUsersEntry.objects.none()
serializer_class = RecordUsersEntrySerializer
def get_queryset(self):
# every field returned because they are supposed to be seen by everybody
return RecordUsersEntry.objects.filter(record__template__rlc=self.request.user.rlc)
Serializer:
class RecordUsersEntrySerializer(serializers.ModelSerializer):
class Meta:
model = RecordUsersEntry
fields = '__all__'
Я разобрался, мне пришлось указать формат, потому что похоже, что тесты иначе отправляют его в multipart/form-data
, что не работает, см: https://github.com/encode/django-rest-framework/issues/2883
Следовательно, это работает:
request = self.factory.patch('', data=data, format='json')