如何清除补丁请求中的多对多字段?
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')
我的多对多关系没有重置。我正在做一个转换成 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')