0

I am posting using an API to create a new entry in the model Movie. Using headers, I would like to be able to POST so the OWNER is the user who has posted it. The users token is sent via headers.

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 Answer 1

1

You can set user using context['request'] of form, which is provided by default in GenericAPIViews. 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
Sign up to request clarification or add additional context in comments.

6 Comments

This has not worked. Do I need to import something? I'm not using genericAPIViews. I'm just using standard serializers. I used PDB to debug- it told me on self.request *** AttributeError: 'TaskSerializer' object has no attribute 'request'
@Ycon What do you mean self.request? it should be self.context['request'].
Ah you're right. So self.context['request'] gives me <rest_framework.request.Request object at 0x10ad0d310>. I used .__dict__ to see inside- and I it contains the Token object. However it doesn't reach my field.
@Ycon I gave you example read more carefully)) it should be movie.owner = self.context['request'].user to assign user from request
@Ycon Ah. I know why. Because we are not saving changes. it should be owner = self.context['request'].user movie = Movie.objects.create(owner=owner, **validated_data). or you should call movie.save() after setting movie.owner See updated answer.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.