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/