Python Django Rest框架:如何实现嵌套逻辑?
假设我有三个模型:Python Django Rest框架:如何实现嵌套逻辑?,python,django,django-models,django-rest-framework,django-views,Python,Django,Django Models,Django Rest Framework,Django Views,假设我有三个模型: class User(AppModel): name = models.CharField(max_length=255) class Business(AppModel): owner = models.ForeignKey("User", related_name="businesses", on_delete=models.CASCADE) legal_name = models.CharField(max_length=255) class
class User(AppModel):
name = models.CharField(max_length=255)
class Business(AppModel):
owner = models.ForeignKey("User", related_name="businesses", on_delete=models.CASCADE)
legal_name = models.CharField(max_length=255)
class Invoice(AppModel):
business = models.ForeignKey("Business", related_name="invoices", on_delete=models.CASCADE)
amount = models.integerField()
如您所见,用户
可以有多个业务
,而业务
可以有多个发票
My serializers.py:
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields= ('name')
class BusinessSerializer(serializers.ModelSerializer):
owner = UserSerializer(many=False)
class Meta:
model = Business
fields= ('owner','legal_name')
class InvoiceSerializer(serializers.ModelSerializer):
business= BusinessSerializer(many=False)
class Meta:
model = Invoice
fields= ('business','amount')
views.py:
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
class BusinessViewSet(viewsets.ModelViewSet):
queryset = Business.objects.all()
serializer_class = BusinessSerializer
class InvoiceViewSet(viewsets.ModelViewSet):
queryset = Invoice.objects.all()
serializer_class = InvoiceSerializer
URL.py:
router = DefaultRouter()
router.register('user', UserViewSet, base_name='users')
router.register('business', BusinessViewSet, base_name='businesses')
router.register('invoice', InvoiceViewSet, base_name='invoices')
urlpatterns = router.urls
http://example.com/api/user
返回所有用户。没问题
但我想要的功能是:
返回http://example.com/api/business/
[ { “法定名称”:“1业务”, “所有者”:1, }, { “法定名称”:“2业务”, “所有者”:1, },]
返回http://example.com/api/business/1/
{ “法定名称”:“1业务”, “所有者”:1, }
应该返回http://example.com/api/business/1/invoices/
[ { "业务":1,, “金额”:100, }, { "业务":1,, “金额”:999, },]
有什么帮助吗?我是django rest框架的新手。上面的类只是一个示例。忽略错误。您应该使用django装饰器,它们是视图集的
@list\u route
和@detail\u route
。但是要小心你的DRF版本。因为这些装饰器在DRF 3.8+中合并为@action
。这是你的电话号码
然后,您将能够从调用此端点
http://example.com/api/business/{{PK}}/invoices/
http://example.com/api/business/1/invoices/
http://example.com/api/business/3/invoices/
http://example.com/api/business/23/invoices/
在这里,您可以从中找到有关@操作的更多详细信息
PS:别忘了在代码中控制空实体结果。您应该返回带有正确状态代码的正确响应
http://example.com/api/business/{{PK}}/invoices/
http://example.com/api/business/1/invoices/
http://example.com/api/business/3/invoices/
http://example.com/api/business/23/invoices/