Django Foreignkey в HyperlinkedModelSerializer, какой тип значения - PullRequest
0 голосов
/ 16 мая 2018

Использование 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, это работает

, но это не из-за чужого ключа

1 Ответ

0 голосов
/ 16 мая 2018

Вы можете использовать стандарт 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 в качестве базового класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...