2017-12-01 17 views
0

モデルのデフォルト機能を正しく書き込む方法は?モデルのデフォルト機能を正しく書き込む方法は?

私は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) 

そして、私のシリアライザとビューで:

:私は TestDCreateAPIViewにアクセスすると

# serializer 
class TestDefaultSerializer(ModelSerializer): 
    class Meta: 
     model = TestDefalt 
     fields = "__all__" 

# view 
class TestDCreateAPIView(CreateAPIView): 
    serializer_class = TestDefaultSerializer 
    permission_classes = [] 
    queryset = TestDefalt.objects.all() 

、私は怒鳴るエラーを取得します

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' 
+2

デフォルトパラメータ関数は引数をとりません。あなたのアプローチを再考してください。 –

+0

FileFieldのデフォルト関数をupload_to関数と混同していますか? –

答えて

1

フィールドのdefaultの値がカールの場合それは何の引数もなく呼ばれているので、あなたのソリューションはうまくいきません。 len(self.name) == 11場合は、おそらくdetailためmaxlength大きいを設定したいので、len(self.name + "something")は、> 11になることを

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) 

注:ここでの適切な解決策はsave()メソッドをオーバーライドすることです。

関連する問題