【问题标题】:django REST combining 2 model views form for json curldjango REST结合了json curl的2个模型视图表单
【发布时间】:2015-02-05 11:33:32
【问题描述】:

我有模型:

class Emp(models.Model):
    full_name = models.CharField(max_length=100)
    mobile = models.CharField(max_length=10,blank=True,null=True)
    email = models.EmailField(blank=True,null=True)

class Enquiry(models.Model):
    date = models.DateField(default=timezone.now)
    number = models.AutoField(primary_key=True)
    products = models.ManyToManyField(Product, related_name="products") 
    referred_by_emp = models.ForeignKey(
        Emp,related_name='ref_emp',
        null=True,blank=True,
        )

序列化器类:

class ReferrerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Emp
        fields = (
            'full_name','mobile','email',
            )

class EnquirySerializer(serializers.ModelSerializer):
    class Meta:
        model = Enquiry
        fields = (
            'name','mobile','email',
            'products',
            'referred_by_emp',
            )

我希望在输入查询详细信息时在表单中获取 Emp 的属性,即全名、手机、电子邮件。 2 个模型的视图:

class RefViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows Emp instances to be viewed or edited.
    """
    model = Emp
    queryset = Emp.objects.all()
    serializer_class = ReferrerSerializer

class EnquiryViewSet(viewsets.ModelViewSet):
        """
        API endpoint that allows Enquiry instances to be viewed or edited.
        """
        model = Enquiry
        queryset = Enquiry.objects.all()
        serializer_class = EnquirySerializer

在 django REST api 中输入查询详细信息时,我还希望捕获 Emp 详细信息并提交表单。并且细节应该在各自的模型中被捕获。如何做到这一点?我是 django 的 REST Api 的新手,但没有找到合适的方法。请用详细的代码指导我来实现这一点。我尝试了 itertools.chain,但可能没有正确使用它进一步我想调用相同的 curl 命令。Thanx 提前 使用 django 1.6.5

【问题讨论】:

标签: python json django rest curl


【解决方案1】:

好吧,我不建议这样做,但是当它必须发生时,我一直在那里。

class ReferrerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Emp
        fields = ('full_name','mobile','email')


class EnquirySerializer(serializers.ModelSerializer):
    class Meta:
        model = Enquiry
        fields = ('name','mobile','email','products',)


# As the fields doesn't already exist you can 'copy' them into the serializer

EnquirySerializer.base_fields["full_name"] = ReferrerSerializer().fields["full_name"]            


# Then in the view we can create another model instance.
# you should use the Serializer or a Form class and not save the data directly to a Emp instance here but i left that out for clarity.

class SomeViewSet(ModelViewSet):
    model = Enquiry

    # post() should only handle new/create calls, but if you want it more clear you can override create() instead.
    def post(self, request, *args, **kwargs):
        self.emp_data = {}
        self.emp_data["full_name"] = self.request.DATA.pop("full_name")
        return super(SomeViewSet, self).post(request, *args, **kwargs)

    def pre_save(self, obj):
       emp = Emp.objects.create(**self.emp_data)
       obj.referred_by_emp = emp
       return obj

【讨论】:

  • stackoverflow.com/users/992401/krs 但我希望同时显示 Inquiry 和 Emp 的形式,以便还可以添加 Emp 详细信息。我该怎么做?
  • 在我的帖子末尾添加 P.S 中的字段,然后从 post() 中的数据中添加 pop()。我用这种用法更新了示例。
  • 异常:无法使用视图名称“state-detail”解析超链接关系的 URL 您可能未能在 API 中包含相关模型,或者在此字段上错误地配置了 lookup_field 属性。这些是查询模型中的其他外键字段,例如州、国家/地区,它们是非强制性的!我该如何解决这个@stackoverflow.com/users/992401/krs。感谢您提前做出的努力
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-07
  • 1970-01-01
  • 2018-07-28
  • 2012-10-09
  • 2015-07-30
  • 1970-01-01
  • 2011-11-07
相关资源
最近更新 更多