Reputation: 93
After reading the DRF tutorial, I try to write a API but get 'Request' object has no attribute 'customer' when I send post request to /api/images/
.I just try to copy and modify codes from the DRF tutorial. Can someone tells me what's going wrong?
(I'm sure that my foreign key relationship break the api because when i comment codes about foreign key it works.)
(Customer is the foreign key of the image.)
models.py
class Customer(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
email = models.EmailField(max_length=100, unique=True)
created_at = models.DateTimeField(auto_now_add=True)
owner = models.ForeignKey('auth.User', related_name='customers', on_delete=models.CASCADE)
class Image(models.Model):
customer = models.ForeignKey(Customer, related_name='images', on_delete=models.CASCADE)
figure = models.ImageField(blank=False, null=False)
serializers.py
# User Serializer
class UserSerializer(serializers.HyperlinkedModelSerializer):
customers = serializers.HyperlinkedRelatedField(many=True, view_name='customer-detail', read_only=True)
class Meta:
model = User
fields = ['url', 'id', 'username', 'customers', 'email']
class CustomerSerializer(serializers.HyperlinkedModelSerializer):
images = serializers.HyperlinkedRelatedField(many=True, view_name='image-detail', read_only=True)
owner = serializers.ReadOnlyField(source='owner.username')
class Meta:
model = Customer
fields = ['url', 'id', 'first_name', 'last_name', 'email', 'images', 'owner']
class ImageSerializer(serializers.HyperlinkedModelSerializer):
customer = serializers.ReadOnlyField(source='customer.email')
class Meta:
model = Image
fields = ['url', 'id', 'figure', 'customer']
views.py
class UserView(generics.RetrieveAPIView):
permission_classes = [
permissions.IsAuthenticated,
]
serializer_class = UserSerializer
def get_object(self):
return self.request.user
class CustomerViewSet(viewsets.ModelViewSet):
"""
This viewset automatically provides `list`, `create`, `retrieve`,
`update` and `destroy` actions.
"""
queryset = Customer.objects.all()
serializer_class = CustomerSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly,
IsOwnerOrReadOnly]
def perform_create(self, serializer):
"""
The create() method of our serializer will now be passed an additional 'owner' field,
along with the validated data from the request.
"""
serializer.save(owner=self.request.user)
class ImageViewSet(viewsets.ModelViewSet):
"""
This viewset automatically provides `list`, `create`, `retrieve`,
`update` and `destroy` actions.
"""
parser_class = (FileUploadParser, )
queryset = Image.objects.all()
serializer_class = ImageSerializer
# permission_classes = [permissions.IsAuthenticatedOrReadOnly,
# IsOwnerOrReadOnly]
def perform_create(self, serializer):
serializer.save(customer=self.request.customer)
Upvotes: 0
Views: 144
Reputation: 88499
You should use self.request.user
to get the authenticated user in Django instead of self.request.customer
. Because, DRF requests doesn't have any attribute named customer
but, user
. So, it should be as,
def perform_create(self, serializer):
serializer.save(customer=self.request.user)
Upvotes: 1