2013-12-14 83 views
4

我的模型中有兩個必填字段,我想在我的ModelViewSet的pre_save方法中填充。儘管設置它們,但在提交.create()請求時,仍然會出現兩個字段都是必需的錯誤,因此無法創建我的對象。嘗試使用pre_save方法來填充必填字段

我做了一些這方面的研究,似乎它涉及到is_valid()檢查正在執行pre_save調用之前......每一些堆棧溢出文章推薦的解決方案,我發現:

Django REST Framework, pre_save() and serializer.is_valid(), how do they work?

Django REST Framework serializer field required=false

似乎是重寫get_validation_exclusions方法。但是,這似乎仍然沒有爲我工作......我在這一點上想它可能與我的模型繼承有關?任何幫助,你可以提供將不勝感激!這就是我的工作 -

serializers.py

class DaytimeSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Daytime 

    def get_validation_exclusions(self): 
     exclusions = super(DaytimeSerializer, self).get_validation_exclusions() 
     return exclusions + [ 'creation_datetime', 'creator_userprofile' ] 

models.py

class UserProfile(models.Model): 
    user = models.OneToOneField(User, related_name='profile') 
    phone_number = models.CharField(max_length=12) 
    friends = models.ManyToManyField('self', related_name = 'friends') 
    field4 = models.CharField(max_length=300, blank=True) 

    def __unicode__(self): 
     return self.user.username + ' UserProfile' 


class Activity(models.Model): 
    field1 = models.CharField(max_length=300) 
    field2 = models.CharField(max_length=300, blank=True) 
    creation_datetime = models.DateTimeField() 
    creator_userprofile = models.ForeignKey(UserProfile) 
    field3 = models.ManyToManyField('self') 
    field4 = models.BooleanField() 
    field5 = models.CharField(max_length=300, blank=True) 

    def __unicode__(self): 
     return self.field1 + ' | ' + self.creator_userprofile.user.username 

    class Meta: 
     abstract = True 

class Daytime(Activity): 
    field6 = models.ManyToManyField(UserProfile, related_name='abc') 
    field7 = models.BooleanField() 

myviewsfile.py

class DaytimeViewSet(viewsets.ModelViewSet): 
    queryset = Daytime.objects.all() 
    serializer_class = DaytimeSerializer 

    def pre_save(self, obj): 
     obj.creator_userprofile = UserProfile.objects.get(user__username = self.request.user) 
     obj.creation_datetime = timezone.now() 

回答

1

所以我從 '固定' 這它現在做我希望的事情的角度,但我不完全確定這是最好的方法。

添加這兩條線的DaytimeSerializer被改變:

class DaytimeSerializer(serializers.HyperlinkedModelSerializer): 
    creator_userprofile = serializers.HyperlinkedRelatedField(source='creator_userprofile',view_name="userprofile-detail") 
    creation_datetime = serializers.Field(source='creation_datetime') 

爲什麼我需要明確地告訴了creation_datetime場應該來自傳入JSONs creation_datetime串行?對所有其他領域都是隱含的......我在這裏錯過了什麼?

此外,現在我做了這個,我不再需要重寫get_validation_exclusions方法。我刪除了那一點。

1

默認情況下,除非您聲明它們是「只讀」,否則這些字段是必需的。

您可以添加不需要用戶輸入到read_only_fields的字段。

或者,您可以像您那樣手動聲明它們。

+4

歡迎來到Stack Overflow。對於在本網站發佈的答案,最好不要依賴外部網站上的內容。也就是說,儘管可以發佈鏈接,但即使外部網站已關閉,已經關閉或更改,也可以預期答案對自己很有用。你認爲你可以編輯你的答案,包括你鏈接到的文檔的相關部分? – ivarni