字段“id”需要一个数字但得到了<User: Aditya@123>

问题描述 投票:0回答:1

我正在为 Django 用户模块和 BookDetail 使用嵌套序列化程序,其中用户是 BookDetail 模型中的外键。对于 perform_create 方法,我收到此错误。 self.request.user 考虑的不是 id,而是 username

class BookDetailsList(ListCreateAPIView):

    serializer_class = BookDetailsSerializer
    permission_classes = (permissions.IsAuthenticated,)

    def perform_create(self, serializer):
        serializer.save(user_id=self.request.user)

    def get_queryset(self):
        return Book_Detail.objects.filter(user_id=self.request.user)

我尝试了不同的方法来获取 id,但我总是得到 。我期待在 perform_create 方法中获得用户模型“id”

模型.py

from django.db import models
from django.contrib.auth.models import User

class Book_Detail(models.Model):
    def nameFile(instance, filename):
        user = User.objects.get(username=instance.user_id)
        return '/'.join([str(user.username), filename])

    book_isbn = models.CharField(max_length=15)
    book_name = models.CharField(max_length=255)
    book_page = models.IntegerField()
    book_medium = models.CharField(max_length=20)
    book_author = models.CharField(max_length=255)
    book_genre = models.CharField(max_length=20)
    book_cover_page = models.ImageField(upload_to=nameFile, blank=True)
    book_last_page = models.ImageField(upload_to=nameFile, blank=True)
    book_page1 = models.ImageField(upload_to=nameFile, blank=True)
    book_page2 = models.ImageField(upload_to=nameFile, blank=True)
    book_page3 = models.ImageField(upload_to=nameFile, blank=True)
    book_rental = models.CharField(max_length=20, null=True, blank=True)
    book_price = models.FloatField()
    book_description = models.TextField(null=True, blank=True)
    status = models.CharField(max_length=45)
    posted_date = models.DateField(null=True)
    user = models.ForeignKey(to=User, on_delete=models.CASCADE, related_name='user')

序列化程序.py

from authentication.serializers import UserSerializer

class BookDetailsSerializer(ModelSerializer):
    user = UserSerializer(read_only=True)

    class Meta:
        model = Book_Detail
        fields = '__all__' 

view.py

from .models import Book_Detail
from .serializers import BookDetailsSerializer
from rest_framework import permissions

class BookDetailsList(ListCreateAPIView):

    serializer_class = BookDetailsSerializer
    permission_classes = (permissions.IsAuthenticated,)

    def perform_create(self, serializer):
        serializer.save(user_id=self.request.user)

    def get_queryset(self):
        return Book_Detail.objects.filter(user_id=self.request.user)
django django-models django-rest-framework django-views django-users
1个回答
0
投票

user_id
是一个特殊的术语,意思是User的字面PK,但是request.user是User对象

您可以通过两种方式做到这一点:

使用对象
# No _id
serializer.save(user=self.request.user)
使用PK
# user.pk 
serializer.save(user_id=self.request.user.pk)

编辑

澄清一下,这个

_id
关键字适用于所有外键:
{field}_id

© www.soinside.com 2019 - 2024. All rights reserved.