如何清除补丁请求中的多对多字段?

How to clear a ManyToMany Field in a patch request?

我的多对多关系没有重置。我正在做一个转换成 djrf partial_update 的补丁请求。但之后 RecordUsersEntry 仍然保存了从 setup_entry.

获得的相同用户

我已经尝试了一个带字段和记录的放置请求,然后重置了多对多关系,但我想用补丁请求重置它。

可能与: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)

序列化器:

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')