ChufanSuki
ChufanSuki

Reputation: 93

Get AttributeError when writing a foreign key relationship in Django Rest Framework

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

Answers (1)

JPG
JPG

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

Related Questions