如何正确编写模型默认功能



如何正确编写模型默认功能?

我有一个 TestDefalt型号及其默认函数:

def genefunc(instance, detail):
    str = instance.name + "/abc/"
    return str
class TestDefalt(models.Model):
    name = models.CharField(max_length=11)
    detail = models.CharField(default=genefunc, max_length=11)

以及我的序列化和视图:

# serializer
class TestDefaultSerializer(ModelSerializer):
    class Meta:
        model = TestDefalt
        fields = "__all__"
# view
class TestDCreateAPIView(CreateAPIView):
    serializer_class = TestDefaultSerializer
    permission_classes = []
    queryset = TestDefalt.objects.all()

当我访问TestDCreateAPIView时,我会遇到波纹错误:

TypeError at /test04/
Got a `TypeError` when calling `TestDefalt.objects.create()`. This may be because you have a writable field on the serializer class that is not a valid argument to `TestDefalt.objects.create()`. You may need to make the field read-only, or override the TestDefaultSerializer.create() method to handle this correctly.
...
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/django/db/models/fields/__init__.py", line 782, in get_default
    return self._get_default()
TypeError: genefunc() missing 2 required positional arguments: 'instance' and 'detail'

如果字段的default值是可召唤的,则无参数,因此您的解决方案无法正常工作。这里的适当解决方案是覆盖save()方法:

class TestDefalt(models.Model):
    name = models.CharField(max_length=11)
    detail = models.CharField(default='', max_length=11)
    def save(self, *args, **kw):
        if not self.pk and not self.detail:
            self.detail = self.name + "whatever"
        return super(TestDefalt).save(*args, **kw)

请注意,如果len(self.name) == 11len(self.name + "something")为> 11,因此您可能想为detail设置更大的maxlength

最新更新