代码之家  ›  专栏  ›  技术社区  ›  milan

使用django rest框架的api设计概念

  •  0
  • milan  · 技术社区  · 7 年前

    api设计是否取决于我们在UI中的呈现方式?

    https://www.franchisebazar.com/franchisor-registration 如果您看到公司注册表格,会看到与公司模式相关联的公司信息、公司品牌和商业模式等部分。提交按钮是唯一的一个,这意味着只有一个api用于发布公司数据。

    但是如果我想让用户界面不同(多个步骤的向导形式,而不是一个单一的大形式)像公司信息在第一步和提交公司个人信息后,下一步将是品牌,然后最后是商业模式。为此,我需要单独设计一个api吗?一个用于公司个人信息,一个用于品牌,一个用于商业模式。

    到目前为止,我的设计如下

    https://gist.github.com/MilanRgm/132eb6c0ba0cf66e48fa0ca4c17ef732

    我将在清单中再次简要说明

    1) 用一个大表单注册公司简介的API设计

    2) 多步骤注册公司档案的API设计

    但是我很困惑。任何来自社区的帮助都是非常感谢的。

    型号.py

    class Company(models.Model):
        owner = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
        name = models.CharField(max_length=150, blank=False, null=False)
        phone_number = models.CharField(max_length=15, blank=False, null=False)
    
    
    class Brand(models.Model):
    
        company = models.ForeignKey(Company, related_name='company_brand', on_delete=models.CASCADE)
        name = models.CharField(max_length=150, blank=False, null=False)
        website = models.URLField()
        description = models.TextField(blank=False)
    
    
    class BusinessModel(models.Model):
    
    
        company = models.ForeignKey(Company, related_name='company_business_model', on_delete=models.CASCADE)
        industry = models.ForeignKey(Industry, null=True, related_name='industry', on_delete=models.SET_NULL)
        segments = models.ForeignKey(Segment, on_delete=models.SET_NULL, null=True)
        total_investment = models.CharField(max_length=50, choices=TOTAL_INVESTMENT, default=None)
    
        def __str__(self):
            return self.company.name
    

    序列化程序.py

    class BrandSerializer(serializers.ModelSerializer):
    
        class Meta:
    
            model = Brand
            fields = '__all__'
    
    
    
    class BusinessModelSerializer(serializers.ModelSerializer):
    
        class Meta:
    
            model = BusinessModel
            fields = '__all__'
    
    
    
    
    class CompanySerializer(serializers.ModelSerializer):
    
        company_brand = BrandSerializer(many=True)
        company_business_model = BusinessModelSerializer(many=True)
    
        class Meta:
    
            model = Company
            fields = '__all__'
    

    class CompanyView(views.APIView):
    
        serializer_class = CompanySerializer
    
        def get(self, request, pk=None, format=None):
            reply = {}
            try:
                companies = Company.objects.all()
                if pk:
                    company = companies.get(pk=pk)
                    reply['data'] = self.serializer_class(company).data
                reply['data'] = self.serializer_class(companies, many=True).data
            except Company.DoesNotExist:
                reply['data'] = []
            return Response(reply, status.HTTP_200_OK)
    
    
        def post(self, request, pk=None, format=None):
            reply = {}
            company={}
            if pk is not None:
                try:
                    company = Company.object.get(pk=pk)
                except Company.DoesNotExist:
                    return error.RequestedResourceNotFound().as_response()
            serialized_data = self.serializer_class(instance=company, data=request.data, partial=True)
            if serialized_data.is_valid():
                serialized_data.save(owner=request.user)
            else:
                return error.ValidationError(serialized_data.errors).as_response()
            reply['data'] = serialized_data.data
            return Response(reply, status.HTTP_200_OK)
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Hasan    7 年前