我正在为 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,但我总是得到
模型.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)
user_id
是一个特殊的术语,意思是User的字面PK,但是request.user是User对象
您可以通过两种方式做到这一点:
# No _id
serializer.save(user=self.request.user)
# user.pk
serializer.save(user_id=self.request.user.pk)
澄清一下,这个
_id
关键字适用于所有外键:{field}_id