2017-10-24 4 views
0

I가 다음 장고 모델 :처리 ManyToMany 필드

class Article(models.Model): 
    name = models.CharField(max_length=30, unique=True) 
    tags = models.ManyToManyField(Tag) 
    ... 

class Tag(models.Model): 
    name = models.CharField(max_length=30, unique=True) 
    ... 
내가 즉,

{ 'name': 'My Org Name', 'tags': [1,2,3] } 
POST 요청을 통해 기사를 작성하는 동안 태그를 기존의 목록을 추가 할 수 있도록하고 싶습니다

여기서 [1, 2, 3]은 태그 ID 목록입니다.

class ArticleSerializer(serializers.ModelSerializer): 
    tags = serializers.PrimaryKeyRelatedField(many=True, read_only=True, allow_null=True) 

    class Meta: 
     model = Article 
     fields = ('name', 'tags', ...) 

    def create(self, validated_data):  
     # in create I will add tags, i.e. article.add(tag)  
     return Article.objects.create_article(**validated_data) 

을하지만 그때 나는 기존의 태그 인스턴스에 속하는 전달되는 태그의 ID를 알 수 있도록 몇 가지 확인을하고 싶습니다 :

내 시리얼은 다음과 같습니다. 그래서 아래의 메소드를 시리얼 라이저에 추가하려고 시도했다.

def validate_tags(self, tags): 
    if tags: 
     for tag in tags: 
      if not Tag.get(pk=tag): 
       raise ValueError('Tag with id not found...') 
    return tags 

어떤 이유로이 유효성 검사 방법이 실행되지 않습니다. 내가 기사에 태그를 추가하는 것을 처리 할 수있는 올바른 방법을 찾으려고 노력하고 있는데, 어떤 제안이라도 높이 평가 될 것입니다.

답변

1

ModelSerializer에서 연장되므로 '태그'를 명시 적으로 지정할 필요가 없으므로 유효성을 검사 할 필요가 없습니다. DRF는 나머지 작업을 수행하고 Model 관계에 따라 필드와 유효성 검사 쿼리를 만듭니다.

class ArticleSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Article 
     fields = ('name', 'tags', ...) 

    def create(self, validated_data): 
     tags = validated_data.pop('tags') 
     article = Article.objects.create(**validated_data) 
     article.tags.add(*tags) 
     return article 
+0

이것은 내가 찾고있는 것입니다. 고맙습니다 :) – foobar

관련 문제