Django-Rest-Framework:如何使用request.user为登录用户发布到foreignkey字段

zac*_*mwa 3 python django rest django-rest-framework

我正在使用Django rest Framework来使api被Android应用程序使用.我有一个活动模型和地点:

  class Event(models.Model):
     user=models.ForeignKey(User,related_name="%(class)s")
     title=models.CharField(max_length=256)
     venue=models.ForeignKey(Venue,related_name="%(class)s_venue")
     description=models.CharField(max_length=256)
     time=models.DateTimeField(max_length=256)
     event_pic=models.ImageField(upload_to="photos/event_pic/%Y/%m/%d",null=True,blank=True)

     album=models.ForeignKey(Album,null=True,blank=True,related_name="%(class)s_album")
     photo=models.ForeignKey(Photo,null=True,blank=True,related_name="%(class)s_photo")

     likes=GenericRelation(Like,null=True,blank=True)
     comments=GenericRelation(Comments,null=True,blank=True)
Run Code Online (Sandbox Code Playgroud)

这是我的场地模型.

class Venue(models.Model):
     name=models.CharField(max_length=256)
     longitude=models.FloatField(null=True,blank=True)
     latitude=models.FloatField(null=True,blank=True)

     def __unicode__(self):
         return self.name
Run Code Online (Sandbox Code Playgroud)

我想使用request.user和使用name的场地字段发布到用户字段.是否可以这样做,如果是这样,我该怎么做.以下是序列化程序和视图.

class WeddingList(generics.ListCreateAPIView):    

     queryset=Wedding.objects.all()
     serializer_class=WeddingSerializer


class WeddingDetail(generics.RetrieveUpdateDestroyAPIView):
     queryset=Wedding.objects.all()
     serializer_class=WeddingSerializer





class VenueList(generics.ListCreateAPIView):
     queryset=Venue.objects.all()
     serializer_class=VenueSerializer

class VenueDetail(generics.RetrieveUpdateDestroyAPIView):
     queryset=Venue.objects.all()
     serializer_class=VenueSerializer

class VenueSerializer(serializers.ModelSerializer):
      class Meta:
           model=Venue
           fields=('name')

class WeddingSerializer(serializers.ModelSerializer):


      class Meta:
           model = Wedding
           excludes=('id',)
Run Code Online (Sandbox Code Playgroud)

Dan*_*gen 5

从Django REST Framework 3开始,pre_save钩子不再可用了.相反,覆盖perform_create:

def perform_create(self, serializer):
    serializer.save(user=self.request.user, ...)
Run Code Online (Sandbox Code Playgroud)

  • 由于未在 request.data 中设置用户,因此在调用 Perform_create 之前如何解决验证失败的问题? (2认同)
  • 我发现我可以在序列化程序中将用户定义为user = serializers.PrimaryKeyRelatedField(read_only = True,default = serializers.CurrentUserDefault()),这可以自动将用户设置为当前用户。并非总是解决方案,但对于我的用例来说已经足够了。 (2认同)

Ade*_*laN 2

在您的视图中添加以下代码:

def pre_save(self, obj):
    # Set here all fields that you need and that aren't already set
    obj.user = self.request.user
    obj.name = ...
Run Code Online (Sandbox Code Playgroud)

并修改它以满足您的需要:)