2016-08-25 14 views
0

私はdjango restフレームワークにはunique_together制約でも使われている一般的な関係について少し問題があります。django restフレームワーク:contenttype unique_togetherとシリアライゼーション

私は、このモデルを持っている:

class VPC(models.Model): 
    name = models.SlugField(null=False, max_length=100) 
    deletable = models.BooleanField(null=False, default=True) 
    date_created = models.DateTimeField(auto_now_add=True) 
    date_modified = models.DateTimeField(auto_now=True) 
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) 
    object_id = models.PositiveIntegerField() 
    content_object = GenericForeignKey('content_type', 'object_id') 

    class Meta: 
     unique_together = (('name', 'content_type', 'object_id')) 

それは一般的な関係とユニークな制約があります:VPCの名前+(所有者である)の一般的な関係を。ここで

は、シリアライザです:

分野で
class VPCSerializer(serializers.ModelSerializer): 

class Meta: 
    model = VPC 
    read_only_fields = ('deletable', 'date_created', 'date_modified') 
    fields = ('name', 'deletable') 
    lookup_field = 'name' 
    validators = [ 
     UniqueTogetherValidator(
      queryset=VPC.objects.all(), 
      fields=('name', 'content_type', 'object_id') 
     ) 
    ] 

私はCONTENT_TYPEを入れて、私は彼らがユーザーによって設定/表示させたくないようOBJECT_IDはありません。

しかし、同じアカウント/名前のVPCを作成するときにdjango.db.utils.integrityerrorエラーが発生するのを避けるために、それらをUniqueTogetherValidatorに配置する必要があります。

しかし、私はVPCを作成しようとすると、今、私はこのエラーを得た:

{ "OBJECT_ID":[ "このフィールドは必須です"]、 "CONTENT_TYPE":[ "このフィールドは必須です。 「]}

は、だから私のviewsets.ModelViewSetに私は(perform_createを上書きしようとした) のobject_idCONTENT_TYPE BUを設定するにはこのメソッドを呼び出す前にエラーが発生しているように見えます。

get_serializer_context() object_idとcontent_typeを含む辞書を返すようにしようとしますが、どちらも機能しません。

私はこれに多くの時間を費やしており、私は見つけられません。 したがって、シリアライザでobject_idとcontent_typeを設定するには、どのメソッドをオーバーライドする必要がありますか?

ありがとうございました。

答えて

0

シリアライザの検証は(ないあなたが「作成」メソッドをオーバーライドし、「CONTENT_TYPE」を埋めるために、リクエストデータに「OBJECT_ID」必要

「perform_create」に

def create(self, request, *args, **kwargs): 

方法で起こりますシリアライザと検証を初期化するために使用されます)。

あなたはたとえば、同様に行うことができ、

def create(self, request, *args, **kwargs): 
    if hasattr(request.data, '_mutable'): 
     request.data._mutable = True 
    request.data['content_type'] = "your_content_type" 
    request.data['content_type'] = "your_object_id" 

    serializer = VPCSerializer(data=request.data, request=request) 
    serializer.is_valid(raise_exception=True) 
    self.perform_create(serializer) 

    return Response here.. 

ちょうどあなたがシリアライザを初期化する前に、必要なデータを記入した後、確認のためにチェックしシリアライザオブジェクトを使用して保存してserilizer.dataまたは任意のカスタム応答あなたを返します欲しいです。

+0

ありがとうございます。 (NB:content_typeとobject_idをシリアライザのfields属性に追加する) – JonDeau

関連する問題