Как очистить поле 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')
Вернуться на верх