HyperlinkedModelSerializer 中的 django 外键是什么类型的值
django foreignkey in HyperlinkedModelSerializer what type of value
使用 django 2.0.2
python3.4
models.py
class Userinfo(models.Model):
useruid = models.BigAutoField(db_column='UserUID', primary_key=True)
username = models.TextField(db_column='Content')
registerdate = models.DateTimeField(db_column='RegisterDate')
class Meta:
managed = False
db_table = 'userinfo'
class Postinfo(models.Model):
postuid = models.BigAutoField(db_column='PostUID', primary_key=True)
useruid = models.ForeignKey(
Userinfo, db_column='UserUID', on_delete=models.CASCADE)
content = models.TextField(db_column='Content')
registerdate = models.DateTimeField(db_column='RegisterDate')
class Meta:
managed = False
db_table = 'postinfo'
serializer.py
class req_AddPostSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = models.Postinfo
fields = ('useruid', 'content')
views.py
class AddPost(viewsets.ModelViewSet):
queryset = ''
serializer_class = req_AddPostSerializer
def create(self, request, *args, **kwargs):
serializer = req_AddPostSerializer(
data=request.data)
if not serializer.is_valid():
return Response(serilizer.errors)
serializer.save()
return Response("succes")
request.data
{
"useruid": "1",
"content": "test"
}
错误
invalid hyperlink - no url match
或
Incorrect type. Expected URL string, received str
url.py
router = routers.DefaultRouter(trailing_slash=False)
router.register(r'AddPost',
views.AddPost, base_name="AddPost")
urlpatterns = [
url(r'^', include(router.urls)),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]
我想要Postinfo.useruid = Userinfo.useruid
但我不知道这个错误
如何做到这一点
如果将 useruid 更改为 IntegerField 就可以了
但是
这不是外键
您可以使用标准 ModelSerializer
并仅将 HyperlinkedRelatedField
用于表示用户 url
,为此您可以覆盖 to_representation
方法:
class req_AddPostSerializer(serializers.ModelSerializer):
class Meta:
model = models.Postinfo
fields = ('useruid', 'content')
def to_representation(self, instance):
self.fields['useruid'] = serializers.HyperlinkedRelatedField(view_name='user-detail', read_only=True)
return super(req_AddPostSerializer, self).to_representation(instance)
如果您不需要将用户表示为 usl 字符串,只需删除 to_representation
方法并使用 ModelSerializer
作为基础 class.
使用 django 2.0.2
python3.4
models.py
class Userinfo(models.Model):
useruid = models.BigAutoField(db_column='UserUID', primary_key=True)
username = models.TextField(db_column='Content')
registerdate = models.DateTimeField(db_column='RegisterDate')
class Meta:
managed = False
db_table = 'userinfo'
class Postinfo(models.Model):
postuid = models.BigAutoField(db_column='PostUID', primary_key=True)
useruid = models.ForeignKey(
Userinfo, db_column='UserUID', on_delete=models.CASCADE)
content = models.TextField(db_column='Content')
registerdate = models.DateTimeField(db_column='RegisterDate')
class Meta:
managed = False
db_table = 'postinfo'
serializer.py
class req_AddPostSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = models.Postinfo
fields = ('useruid', 'content')
views.py
class AddPost(viewsets.ModelViewSet):
queryset = ''
serializer_class = req_AddPostSerializer
def create(self, request, *args, **kwargs):
serializer = req_AddPostSerializer(
data=request.data)
if not serializer.is_valid():
return Response(serilizer.errors)
serializer.save()
return Response("succes")
request.data
{
"useruid": "1",
"content": "test"
}
错误
invalid hyperlink - no url match
或
Incorrect type. Expected URL string, received str
url.py
router = routers.DefaultRouter(trailing_slash=False)
router.register(r'AddPost',
views.AddPost, base_name="AddPost")
urlpatterns = [
url(r'^', include(router.urls)),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]
我想要Postinfo.useruid = Userinfo.useruid 但我不知道这个错误 如何做到这一点
如果将 useruid 更改为 IntegerField 就可以了
但是 这不是外键
您可以使用标准 ModelSerializer
并仅将 HyperlinkedRelatedField
用于表示用户 url
,为此您可以覆盖 to_representation
方法:
class req_AddPostSerializer(serializers.ModelSerializer):
class Meta:
model = models.Postinfo
fields = ('useruid', 'content')
def to_representation(self, instance):
self.fields['useruid'] = serializers.HyperlinkedRelatedField(view_name='user-detail', read_only=True)
return super(req_AddPostSerializer, self).to_representation(instance)
如果您不需要将用户表示为 usl 字符串,只需删除 to_representation
方法并使用 ModelSerializer
作为基础 class.