2017-01-19 14 views
1

次のリンクは、必要なIDを渡しますid = serializers.UUIDField()を使用することにより、だから、私をたくさんDjangoの残りのフレームワークポスト主キーUUIDまたは自動生成

reference

を助けました。 オンが見つからない場合、自動的に自動生成されなくなります。

シリアライザでIDをPOSTできるようにするには、Createメソッドをオーバーライドする必要があり、投稿データにIDが渡されない場合は、新しいuuidを生成して保存します。 これが正しいですか? OR DRFが許可する方法と、IDを渡す方法と、そうでない場合に自動生成する方法はありますか?

編集:私はCreateメソッドをオーバーライドし、それが存在しない場合は、新しいUUIDを生成しようとしたが、DRFが最初のデータをチェックし、まだ

{ 
"id": [ 
"This field is required." 
] 
} 




を返しているかのように表示されます
Psこれは全く関連性があるが、主キーのUUIDを使用し、私たちのモデルは、以下の

モデル

class Company(models.Model): 
id = PGUUIDField(primary_key=True) 

と定義を使用している場合、私は知りません

class PGUUIDField(CharField): 
def __init__(self, *args, **kwargs):  
    kwargs.setdefault('editable', not kwargs.get('primary_key', False)) 
    kwargs.setdefault('default', uuid.uuid4) 
    kwargs.setdefault('max_length', 36) 
    super(PGUUIDField, self).__init__(*args, **kwargs) 
def deconstruct(self): 
    name, path, args, kwargs = super(PGUUIDField, self).deconstruct() 
    # Only include kwarg if it's not the default 
    return name, path, args, kwargs 
def db_type(self, connection=None): 
    return 'uuid' 
def get_db_prep_value(self, value, *args, **kwargs):   
    return self.to_python(value) 
def to_python(self, value): 
    if not value: 
     return None 
    if not isinstance(value, uuid.UUID): 
     value = uuid.UUID("%s"%value) 
    return value 

答えて

1

回答:

initメソッドをオーバーライドし、kwargsの 'id'パラメータがkwargs['data']['id']であるかどうか確認し、存在しない場合は、スーパークラスを呼び出す前にkwargsに 'id'フィールドを追加します。

class ControllerSerializer(serializers.ModelSerializer): 
id = serializers.UUIDField() 
class Meta: 
    model = Controller 
    fields = ('id', 'name', 'other_id') 

def __init__(self, *args, **kwargs): 
    if kwargs['context']['request'].method == "POST": 
     try: 
      kwargs['data']['id'] 
     except: 
      kwargs['data']['id'] = uuid.uuid4() 
    super(ControllerSerializer, self).__init__(*args, **kwargs) 

これで、指定したIDでPOSTすることができます。

p.s. printステートメントはデバッグ用です

関連する問題