2014-08-27 67 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

相關問題