【问题标题】:form is not shown despite being nested to company model尽管嵌套到公司模型,但未显示表单
【发布时间】:2019-02-19 18:50:48
【问题描述】:

我正在尝试开发的应用程序的用例是注册对特许经营感兴趣的公司。我从franchisebazar 中获取了这个概念,用于学习目的。在那里我看到了公司信息、品牌信息和注册公司的商业模式。这就是我创建以下模型的原因。我现在想要创建和更新视图,所以我可以从前端点击 api 请求来创建和更新。我设计了以下serializerAPIView。但是,当我尝试在浏览器中进行测试时,无论编码方式是否有效,尽管它们嵌套在公司中,但我看不到品牌和商业模式的表格。因此,我想知道我是否必须通过分别为品牌和商业模式创建视图来扩展它,或者我在代码中做错了什么。

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


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)


class CompanySerializer(serializers.ModelSerializer):

    company_brand = BrandSerializer(many=True)
    company_business_model = BusinessModelSerializer(many=True)

    class Meta:

        model = Company
        fields = '__all__'

【问题讨论】:

    标签: django django-models django-rest-framework django-views


    【解决方案1】:

    您看不到允许您更新品牌和业务模型实例的表单的一个原因是模型序列化程序的默认行为不允许您这样做。您需要在序列化程序中编写自己的自定义更新方法,以保存对品牌和业务实例所做的更改。

    【讨论】:

    • 非常感谢您的回答。那么,只有更新方法可以工作,然后不需要创建单独的品牌和商业模式视图?
    • 此时您只能更新公司实例。如果您愿意,您可以只使用一个视图(并自定义序列化程序和可能的视图以更新品牌和业务模型实例),尽管我认为为您需要更新的每个模型实例创建单独的端点更符合 RESTful 约定。希望其他人可以帮助您更新所有 3 个实例部分。我自己从来没有做过,对这个框架还是很陌生。
    猜你喜欢
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多