【发布时间】:2026-01-20 03:00:01
【问题描述】:
我花了很多时间试图理解我遇到的这个错误。
来自models.py
class Company(models.Model):
name = models.CharField(max_length=100, unique=True, default="")
email = models.CharField(max_length=100, unique=True, default="")
password = models.CharField(max_length=100, unique=True, default="")
bsb = models.IntegerField(default=0)
account = models.IntegerField(default=0)
sign_up_date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.name
class Payment(models.Model):
company = models.ForeignKey(Company, on_delete=models.CASCADE, related_name="payments")
name = models.CharField(max_length=100, unique=True, default="")
bsb = models.IntegerField(default=0)
account = models.IntegerField(default=0)
created_date = models.DateTimeField(auto_now_add=True)
paid_date = models.DateTimeField(default=datetime.now() + timedelta(days=36500))
status = models.IntegerField(default=0)
来自serializers.py
from rest_framework import serializers
from .models import Payment, Company
class PaymentSerializer(serializers.ModelSerializer):
company = serializers.ReadOnlyField(source='company.name')
class Meta:
model = Payment
fields = ['company', 'name', 'bsb', 'account', 'created_date', 'paid_date', 'status']
class CompanySerializer(serializers.ModelSerializer):
payments = serializers.PrimaryKeyRelatedField(many=True, queryset=Payment.objects.all())
class Meta:
model = Company
fields = ["name", "email", "password", "payments",
"bsb", "account", "sign_up_date"]
如您所见,我在 Payment 类中包含了相关名称作为公司属性的“payments”。但是当我访问 http://localhost:8000/bill_payer/resources/company 时出现以下错误:
AttributeError: 'User' object has no attribute 'payments'
我已经通过 manage.py shell 验证了我的 Company 类确实有支付类。
有什么想法吗?我是新的。这是views.py,以防它很重要:
class PaymentList(APIView):
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
def get(self, request):
payments = Payment.objects.all()
serializer = PaymentSerializer(payments, many=True)
return Response(serializer.data)
def perform_create(self, serializer):
serializer.save(company=self.request.user)
class PaymentDetail(APIView):
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
def get_object(self, pk):
try:
return Payment.objects.get(pk=pk)
except Payment.DoesNotExist:
raise Http404
def get(self, request, pk):
payment = self.get_object(pk)
serializer = PaymentSerializer(payment)
return Response(serializer.data)
def put(self, request, pk):
payment = self.get_object(pk)
serializer = PaymentSerializer(payment, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, pk):
payment = self.get_object(pk)
payment.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
class CompanyList(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = CompanySerializer
class CompanyDetail(generics.RetrieveAPIView):
queryset = User.objects.all()
serializer_class = CompanySerializer
【问题讨论】:
标签: python django rest django-rest-framework