2016-11-08 9 views
0

APIを使用してポストして、モデルムービーに新しいエントリを作成しています。ヘッダーを使用してPOSTを実行して、OWNERが投稿したユーザーであるようにしたいと考えています。ユーザートークンはヘッダー経由で送信されます。ヘッダからのトークンを使用したポストAPI

models.py

@receiver(post_save, sender=settings.AUTH_USER_MODEL) 
def create_auth_token(sender, instance=None, created=False, **kwargs): 
    if created: 
     Token.objects.create(user=instance) 

class Movie(models.Model): 
    title = models.CharField("Title", max_length=10000, blank=True) 
    tag = models.ManyToManyField('Tag', blank=True) 
    created = models.DateTimeField("Created", auto_now_add=True) 
    owner = models.ForeignKey('auth.User', blank=True, null=True) 

Views.py

class OwnerFilterBackend(filters.BaseFilterBackend): 
    def filter_queryset(self, request, queryset, view): 
     return queryset.filter(owner=request.user) 

class AllViewSet(viewsets.ModelViewSet): 
    filter_backends = (OwnerFilterBackend,) 
    queryset = Movie.objects.order_by('-created',).exclude(deleted=True).exclude(typetask=2) 
    serializer_class = AllSerializer 

Serializers.py

あなたが設定することができます
class AllSerializer(serializers.ModelSerializer): 
    tag = TagSerializer(many=True, read_only=True) 
    class Meta: 
     model = Movie 
     fields = ('title', 'mail', 'pk', 'tag', 'info', 'created', 'deleted', 'status', 'typetask') 

    def create(self, validated_data): 
     tags_data = validated_data.pop('tag') 
     movie = Movie.objects.create(**validated_data) 
     for tag_data in tags_data: 
      tag_qs = Tag.objects.filter(name__iexact=tag_data['name']) 
      if tag_qs.exists(): 
       tag = tag_qs.first() 
      else: 
       tag = Tag.objects.create(**tag_data) 
      task.tag.add(tag) 
     return movie 

答えて

1

ユーザーはcontext['request']という形式を使用しています。これはデフォルトでGenericAPIViewに指定されています。 http://www.django-rest-framework.org/api-guide/serializers/#including-extra-context

def create(self, validated_data): 
    tags_data = validated_data.pop('tag') 
    owner = self.context['request'].user 
    movie = Movie.objects.create(owner=owner, **validated_data) 
    for tag_data in tags_data: 
     tag_qs = Tag.objects.filter(name__iexact=tag_data['name']) 
     if tag_qs.exists(): 
      tag = tag_qs.first() 
     else: 
      tag = Tag.objects.create(**tag_data) 
     task.tag.add(tag) 
    return movie 
+0

これは機能しませんでした。私は何かを輸入する必要がありますか?私はgenericAPIViewsを使用していません。私は標準のシリアライザを使っています。私はPDBを使って 'self.request'をデバッグしました*** AttributeError: 'TaskSerializer'オブジェクトに属性 'request'がありません – Ycon

+0

@Ycon' self.request'とはどういう意味ですか?それは 'self.context ['request']'でなければなりません。 –

+0

あなたは正しいです。だから 'self.context ['request']'は私に ''を返します。私は '.__ dict__'を使って内部を見ました。そして、私はトークンオブジェクトを含んでいます。しかし、それは私のフィールドには届かない。 – Ycon

関連する問題