簡體   English   中英

在 Django Rest 框架中寫入外鍵關系時出現 AttributeError

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

閱讀 DRF 教程后,我嘗試編寫 API 但收到“請求” object 在我向/api/images/發送發布請求時沒有屬性“客戶”。我只是嘗試復制和修改 DRF 教程中的代碼。 有人可以告訴我出了什么問題嗎? (我確定我的外鍵關系破壞了 api,因為當我評論有關外鍵的代碼時它可以工作。)

(客戶是圖像的外鍵。)

模型.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)

序列化程序.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']

視圖.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)

您應該使用self.request.user在 Django 而不是self.request.customer中獲取經過身份驗證的用戶。 因為,DRF 請求沒有任何名為customer的屬性,而是user 所以,它應該是,

def perform_create(self, serializer):
    serializer.save(customer=self.request.user)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM