- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
所以我有这个类:
class MyClass(models.Model):
name = models.CharField(max_length=100)
created_time = models.DateTimeField(auto_now_add = True)
modified_time = models.DateTimeField(auto_now = True)
然后是代表相关照片的其他类到 MyClass:
class MyPhoto(models.Model):
myclass = models.ForeignKey(MyClass, unique=False, related_name='photos')
photo = models.ImageField(upload_to='photos',blank=False)
我想创建一个端点,它将处理照片上传(内容类型将是多部分的,相关 myclass 的 ID 将在 url 中传递),所以这就是我所拥有的:
urls.py:
router = routers.DefaultRouter()
router.register(r'photos/(?P<myclass_id>\d+)',PhotoViewSet)
View 集:
class PhotoViewSet(CreateModelMixin,
viewsets.GenericViewSet):
queryset = MyPhoto.objects.all()
serializer_class = serializers.PhotoAlterSerializer
parser_classes = (parsers.MultiPartParser,)
def create(self, request, *args,**kwargs):
myclass = MyClass.objects.get(pk=kwargs['myclass_id'])
serializer = serializers.PhotoAlterSerializer(data=request.data,context={'request': request})
if serializer.is_valid(raise_exception=True):
photo=serializer.save(myclass=myclass)
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
和序列化器:
class PhotoAlterSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = MyPhoto
fields = ('myclass','photo')
如您所见,我向 serializer.save(myclass=myclass) 方法添加了额外的属性 myclass。
但是,如果我上传照片并在 url 中正确传递 myclass id,我会收到 This field is required. 错误。如果我将指向 myclass 的正确超链接添加到上传的带有照片的多部分表单中,请求将通过验证,然后来自表单的 myclass 将被我从 url id 获得的 myclass 替换。
如果我只将照片发布到 url http://blabla/api/photos/2,我该如何进行这项工作?这张照片和 pk=2 的 myclass 的实例将被保存到 db?
最佳答案
这是因为您在序列化程序的字段元中指定了 myclass
。这使得 DRF 需要并验证它作为 POST 数据的一部分。您自己设置的任何字段都不应该是序列化程序字段的一部分。因此,要使其正常工作,您只需从 Meta.fields
中删除 myclass
。
class PhotoAlterSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = MyPhoto
fields = ('photo', )
关于python - 如何在 DRF 中的序列化程序验证/保存之前添加其他数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28653011/
我想用C语言开发一个函数来进行一些处理,但这取决于chrome进程的状态。所以如果chrome正在运行,我应该杀死该进程以使程序正确执行 If(chrome is running ) system("
我是一名优秀的程序员,十分优秀!