django REST框架不起作用在模型

时间:2017-05-13 11:11:38

标签: python django django-rest-framework django-jsonfield

我是Django的新手,我正在尝试实现一个Product Lookup模块从MySQL获取数据来响应GET请求。

这是我的模特

models.py

class CNF_BRAND(models.Model):
    COMPANY_NAME = models.CharField(max_length=255)
    BRAND_NAME = models.CharField(max_length=255)
    BRAND_DESC = models.CharField(max_length=1024)  

serializers.py

class BrandSerializer(serializers.ModelSerializer):
    class Meta:
        model = CNF_BRAND

获取回复

{
  "Status": "SUCCESS",
  "Brand": [
    {
      "COMPANY_NAME": "Test",
      "BRAND_NAME": "Test Brand",
      "BRAND_DESC": "Classic",
    }
  ]
}

views.py

response_data = {}

brand=CNF_BRAND.objects.all() #Main Cone #Man Goods
serializedProduct = BrandSerializer(brand, many=True)

response_data['Brand'] = serializedProduct.data

response = JsonResponse(response_data, status=status.HTTP_200_OK)
return HttpResponse(response,content_type="application/json")

工作正常。

更新代码

class CNF_BRAND(models.Model):
    COMPANY_NAME = models.CharField(max_length=255)
    BRAND_NAME = models.CharField(max_length=255)
    BRAND_DESC = models.CharField(max_length=1024)  
    TITLE = models.CharField(max_length=21)
    FAV_ICON = models.URLField(max_length=1024)

获取回复

{
  "Status": "SUCCESS",
  "Brand": [
    {
      "COMPANY_NAME": "Test",
      "BRAND_NAME": "Test Brand",
      "BRAND_DESC": "Classic",
    }
  ]
}

获取响应中没有变化。我做了

python manage.py makemigrations

python manage.py migrate

多次重启django服务器

我可以看到数据库中的新字段&更新了字段值。但无法在我的回复中看到新字段。

更新

serializers.py

class BrandSerializer(serializers.ModelSerializer):
 PRODUCT = ProductSerializer(many=True)
  class Meta:
   model = CNF_BRAND
   fields = '__all__' 

打印

即使存在上述问题,我也可以在控制台中打印相应的值

print(brand[0].TITLE)
print(brand[0].FAV_ICON)

控制台

My Title
https://www.google.co.in/images/branding/product/ico/googleg_lodp.ico

Rest客户端未收到回复

获取回复

{
  "Status": "SUCCESS",
  "Brand": [
    {
      "COMPANY_NAME": "Test",
      "BRAND_NAME": "Test Brand",
      "BRAND_DESC": "Classic",
    }
  ]
}

3 个答案:

答案 0 :(得分:1)

将字段属性添加到序列化程序的元类

fields = [f.name for f in self.fields]

或者,

fields = ('COMPANY_NAME', 'BRAND_NAME', 'BRAND_DESC', 'TITLE', 'FAV_ICON')

然后再次尝试回复。

修改

问题我认为您只关注在迁移之前创建的响应对象。 我认为响应中的对象只包含上一次迁移中的字段。 他们没有TITLE或FAV_ICON,这就是为什么响应只有之前的字段。 为了在响应中获取新字段,您应该创建新对象,然后尝试请求响应,该响应应该提供适当的字段。

如果要求现有对象具有这些字段,您还可以为字段指定一些默认值。可以在模型字段选项中指定默认值。有关更多详细信息,请参阅Django文档以获取模型字段参考。

下面 https://docs.djangoproject.com/en/1.11/ref/models/fields/

答案 1 :(得分:0)

基本上@Fazil_Zaid的回答是正确的。也许你的观点是错的。您正在使用modelSerializer,因此您可以编写如下的APIView视图:

class FlightList(APIView):
    u"""View of flights."""

    def perform_create(self, serializer):
        u"""Pre-create method."""
        serializer.save(added_by=self.request.user)

    def get(self, request, format=None):
        u"""Get flights on HTTP GET."""
        flights = Flight.objects.all()
        serializer = FlightSerializer(flights, many=True)
        return Response(serializer.data)

section 3

中的Rest文档对此进行了解释

答案 2 :(得分:0)

刚删除了迁移文件夹&重新创建数据库(因为它处于初始阶段)然后运行命令

python manage.py makemigrations

python manage.py migrate

现在它支持进一步新添加的字段