2014-08-27 69 views
2

我正在使用Django rest Framework来使api被android应用程序使用。我有一个模型的事件和地点:Django-Rest-Framework:如何发布到foreignkey字段使用request.user登录用户

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) 

这是我的场地模型。

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 

我想用request.user和使用name.Is有可能做到这一点的场地现场张贴到用户字段,如果让我怎么做。 这里是串行器和视图。

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',) 

回答

1

在视图中添加以下代码:

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 = ... 

并对其进行修改,以符合您的需求:)

+0

将名称作为场地的名称? – zacmwa 2014-08-27 16:03:01

+0

这取决于你是哪一类。 pre_save方法有一个obj参数,即将要创建的对象。所以,如果你在VenueList,是的,obj将是一个场地 – AdelaN 2014-08-27 18:09:46

+0

谢谢你@AdelaN。你得到了很多帮助。 – zacmwa 2014-08-27 18:39:00

4

由于Django的REST框架3,pre_save钩不再可用。相反,覆盖perform_create

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

因为用户未在request.data中设置,所以在调用perform_create之前,您如何避免验证失败? – varikin 2015-04-12 16:41:22

+0

@varikin嗯,这是一个很好的观点。我不知道:) – 2015-04-13 19:44:47

+1

我发现我可以在序列化程序中将用户定义为user = serializers.PrimaryKeyRelatedField(read_only = True,default = serializers.CurrentUserDefault()),它将用户自动设置为当前用户。并不总是解决方案,但足以满足我的用例。 – varikin 2015-04-13 21:13:13

相关问题