Концепция дизайна API с использованием Django Rest Framework - PullRequest
0 голосов
/ 16 сентября 2018

Мой вопрос или скажите, что мое замешательство

Зависит ли дизайн API от того, как мы представляем в пользовательском интерфейсе?

Я проиллюстрирую свое замешательство одним из примеров. Будет ли дизайн API другим, если я хочу, чтобы форма была в несколько этапов? Я имею в виду в https://www.franchisebazar.com/franchisor-registration, если вы видите форму для регистрации компании, есть раздел, такой как информация о компании, бренд компании и бизнес-модель, которые связаны с моделью компании. Кнопка отправки только одна означает, что для публикации данных компании будет только один API.

Но что, если я хочу, чтобы пользовательский интерфейс отличался (форма мастера с несколькими шагами вместо одной большой формы), например информация о компании на первом шаге, а после отправки личной информации о компании следующим шагом будет бренд, а затем бизнес-модель , Для этого мне нужно разработать API отдельно? Один для личной информации компании, один для бренда и один для бизнес-модели.

до сих пор мой дизайн выглядит следующим образом

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

Я снова опишу это в списке

1) Дизайн API для регистрации профиля компании с использованием одной большой формы

2) Разработка API для регистрации профиля компании с использованием многоэтапного способа

Хотя я в замешательстве. Любая помощь от сообщества высоко ценится.

Вот и код, который я придумал

models.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

serializers.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__'

views.py

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 Ответ

0 голосов
/ 16 сентября 2018

Дизайн вашего API зависит от бизнес-кейса.Иногда это также зависит от GUI.В вашем случае лучше разработать один API.Но на переднем конце, вы можете разработать в соответствии с вашими потребностямиВы можете создать многоэтапную форму, сохранить ее в объектах Javascript, в конце процесса вы можете поместить эти многоэтапные данные формы в свой API.Или вы можете просто проектировать на большой форме.

...