2016-11-08 31 views
0

我使用API​​发布以在模型Movie中创建新条目。使用标题,我希望能够发布,所以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 s中提供。 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'对象没有属性'请求' – Ycon

+0

@Ycon你是什么意思'self.request'?它应该是'self.context ['request']'。 –

+0

啊你是对的。所以'self.context ['request']'给了我''。我用'.__ dict__'来查看内部 - 我包含Token对象。但它没有达到我的领域。 – Ycon

相关问题