gpt4 book ai didi

django - 尝试使用 pre_save 方法填充必填字段

转载 作者:行者123 更新时间:2023-12-01 03:52:52 26 4
gpt4 key购买 nike

我的模型中有两个必填字段,我想在 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' ]

模型.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()

View 文件.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()

最佳答案

所以我从它现在做我希望它会做的角度“修复”了这个,但我不完全确定这是最好的方法。

将这两行添加到 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 字段应该来自传入的 JSONscreation_datetime?它对所有其他领域都是隐含的……我在这里遗漏了什么吗?

此外,既然我这样做了,我不再需要覆盖 get_validation_exclusions 方法。我去掉了那一点。

关于django - 尝试使用 pre_save 方法填充必填字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20579827/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com