django REST 框架无法在模型中显示新字段
django REST framework does not work show new fields in a model
我是 Django 的新手,我正在尝试实现一个产品查找模块从 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 迁移
多次重启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",
}
]
}
向序列化程序的元 class 添加字段属性,
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/
基本上@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)
中的 Rest 文档对此进行了解释
刚刚删除迁移文件夹并重新创建数据库(因为它处于初始阶段)然后 运行 命令
python manage.py makemigrations
python manage.py migrate
现在它支持更多新添加的字段
我是 Django 的新手,我正在尝试实现一个产品查找模块从 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 迁移
多次重启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",
}
]
}
向序列化程序的元 class 添加字段属性,
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/
基本上@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)
中的 Rest 文档对此进行了解释
刚刚删除迁移文件夹并重新创建数据库(因为它处于初始阶段)然后 运行 命令
python manage.py makemigrations
python manage.py migrate
现在它支持更多新添加的字段