【问题标题】:Trying to use the pre_save method to populate required fields尝试使用 pre_save 方法填充必填字段
【发布时间】:2014-01-02 00:12:06
【问题描述】:

我的模型上有两个必填字段,我想将它们填充到我的 ModelViewSet 的 pre_save 方法中。尽管将它们设置在那里,但在提交 .create() 请求时,我仍然收到一个错误,指出这两个字段是必需的,因此无法创建我的对象。

我对此进行了一些研究,似乎它与调用 pre_save 之前执行的 is_valid() 检查有关...根据我发现的一些堆栈溢出文章推荐的解决方案:

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

Django REST Framework serializer field required=false

似乎是要覆盖get_validation_exclusions 方法。但是,这似乎仍然对我不起作用......我在想此时它可能与我的模型继承有关?您能提供的任何帮助将不胜感激!这就是我正在使用的 -

序列化器.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()

【问题讨论】:

    标签: django django-models django-rest-framework


    【解决方案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 字段应该来自传入的 JSON 的 creation_datetime?它对所有其他领域都是隐含的……我在这里遗漏了什么吗?

    另外,既然我这样做了,我不再需要重写 get_validation_exclusions 方法。我删除了那个位。

    【讨论】:

      【解决方案2】:

      默认情况下,这些字段是必需的,除非您将它们声明为“只读”。

      您可以将不需要用户输入的字段添加到read_only_fields

      或者,您可以像以前一样手动声明它们。

      【讨论】:

      • 欢迎来到 Stack Overflow。对于本网站上发布的答案,最好不要依赖外部网站上的内容。也就是说,虽然发布链接是可以的,但即使外部站点关闭、消失或更改,也希望答案对自身有用。您认为您可以编辑您的答案以包含您链接到的文档的相关部分吗?
      猜你喜欢
      • 2011-09-21
      • 2021-05-06
      • 2017-10-27
      • 1970-01-01
      • 1970-01-01
      • 2012-01-22
      • 2014-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多