我在这里有一些问题.我试图返回由消息和模型实例组成的JSON响应:
class MachineModel(models.Model):
name = models.CharField(max_length=64, blank=False)
description = models.CharField(max_length=64, blank=False)
manufacturer = models.ForeignKey(Manufacturer)
added_by = models.ForeignKey(User, related_name='%(app_label)s_%(class)s_added_by')
creation_date = models.DateTimeField(auto_now_add=True)
last_modified = models.DateTimeField(auto_now=True)
machine_model_model = form.save(commit=False)
r_user = request.user.userprofile
machine_model_model.manufacturer_id = manuf_id
machine_model_model.added_by_id = request.user.id
machine_model_model.save()
alert_message = " The'%s' model " % machine_model_model.name
alert_message += ("for '%s' " % machine_model_model.manufacturer)
alert_message += "was was successfully created!"
test = simplejson.dumps(list(machine_model_model))
data = [{'message': alert_message, 'model': test}]
response = JSONResponse(data, {}, 'application/json')
class JSONResponse(HttpResponse):
"""JSON response class."""
def __init__(self, obj='', …Run Code Online (Sandbox Code Playgroud) 我正在尝试序列化(自定义)Django用户模型的实例,如下所示:
在models.py中:
Class Employee(User):
company = models.ForeignKey('Company')
additionalField1
additionalField2
etc....
Run Code Online (Sandbox Code Playgroud)
在上面的Employee模型中,除了从User模型继承的属性之外,我还使用以下模型字段类型:CharField(),NullBooleanField(),IntegerField(),DateField(),DecimalField()
有问题的代码:
employee = Employee()
(snip large amounts of code that sets various attributes for employee)
serializers.serialize("json", [employee, ])
Run Code Online (Sandbox Code Playgroud)
(我已经安装了WadOfStuff的Django完整的串行器插件,顺便说一句,重要的是 - 但在这种情况下我认为它应该默认为标准的Django序列化器,因为在这种情况下我没有使用任何完整的串行器的功能)
在尝试序列化之前,员工__dict__(有几个关键字段是匿名的):
{'status': u'Act', 'last_name': u'Doe', 'payFrequency': u'Mo', '_state':
<django.db.models.base.ModelState object at 0x15be890>, 'sex': u'M', 'user_ptr_id':
None, 'is_staff': False, 'isRegistered': False, 'hireDate': u'2012-08-01', 'id': None,
'date_joined': datetime.datetime(2012, 10, 25, 2, 39, 22, 793015, tzinfo=<UTC>),
'city': u'San Francisco', 'first_name': u'John', 'zip': u'94114', u'employmentType':
u'FT', 'company_id': 4, 'compType': u'S', 'is_superuser': False, …Run Code Online (Sandbox Code Playgroud) 我有一个Person存储人员详细信息的模型.
class Person(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
birthdate = models.DateField()
Run Code Online (Sandbox Code Playgroud)
我也有模特PersonLogs来存储人的活动日志.
class PersonLogs(models.Model):
person = models.ForeignKey(Person)
time = models.DateTimeField(auto_now_add=True)
Run Code Online (Sandbox Code Playgroud)
我正在使用Django Serializer将Person对象作为响应返回JSON格式.
from django.core import serializers
data = serializers.serialize("json", Person.objects.all())
Run Code Online (Sandbox Code Playgroud)
输出:
{
"model": "store.person",
"fields": {
"first_name": "Douglas",
"last_name": "Adams",
"birth_date": "1952-03-11",
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想回到PersonLogsJSON回复.
预期产出:
{
"model": "store.person",
"fields": {
"first_name": "Douglas",
"last_name": "Adams",
"birth_date": "1952-03-11",
"personlogs": [['2015-06-09 15:42:58.861540'], ['2014-06-09 15:42:58.861540'], [2013-06-09 15:42:58.861540]]
}
}
Run Code Online (Sandbox Code Playgroud)
我查看了官方文档,但我没有得到任何帮助.链接
我正在使用默认的 User 模型,并且还使用 UserExtended 模型对其进行了扩展:
class Country(models.Model):
countryName = models.CharField(max_length=50, unique=True)
countryCode = models.CharField(max_length=10, unique=True)
class UserExtended(models.Model):
user = models.OneToOneField(User, related_name="userextended")
country = models.ForeignKey(Country)
Run Code Online (Sandbox Code Playgroud)
我正在尝试遵循此处记录的内容:http : //www.django-rest-framework.org/api-guide/relations/#reverse-relations
这是我的 UserSerializer:
class UserSerializer(serializers.ModelSerializer):
def __init__(self, *args, **kwargs):
super(UserSerializer, self).__init__(*args, **kwargs) # call the super()
for field in self.fields: # iterate over the serializer fields
self.fields[field].error_messages['required'] = 'Enter a valid %s.'%field # set the custom error message
class Meta:
model = User
fields = ('username', 'password', 'email', 'userextended')
extra_kwargs = {
'password': …Run Code Online (Sandbox Code Playgroud) django django-models django-serializer django-rest-framework
我需要在一个请求categories中多次更新Article。
在ArticleViewSet我有:
def get_serializer_class(self):
if self.action in ['partial_update', 'update']:
return ArticlePostSerializer
return ArticleSerializer
Run Code Online (Sandbox Code Playgroud)
所以ArticlePostSerializer需要改变。
这是我的序列化程序代码:
class ArticleShortCategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = 'id', 'name'
class ArticleSerializer(serializers.ModelSerializer):
categories = serializers.SerializerMethodField()
def get_categories(self, obj):
return ArticleShortCategorySerializer(obj.categories, many=True).data
class Meta:
model = Article
read_only_fields = 'id'
fields = ('categories', 'text') + read_only_fields
class ArticlePostSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = 'id', 'categories', 'text'
Run Code Online (Sandbox Code Playgroud)
我尝试添加:
class ArticlePostListSerializer(serializers.ListSerializer):
Run Code Online (Sandbox Code Playgroud)
和
class Meta:
list_serializer_class = ArticlePostListSerializer …Run Code Online (Sandbox Code Playgroud) 我想像示例一样填充图表:https://www.chartjs.org/docs/latest/charts/bar.html
我收到此错误:
AttributeError at /timesheet/json-month/
Got AttributeError when attempting to get a value for field `working_hour` on serializer `TimesheetSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `str` instance.
Original exception text was: 'str' object has no attribute 'working_hour'.
Run Code Online (Sandbox Code Playgroud)
有了这个模型:
class Timesheet(models.Model):
owner = models.ForeignKey(User, on_delete = models.CASCADE)
title = models.CharField(max_length = 64, verbose_name = _("Title"))
date = models.DateField(default=datetime.datetime.now())
working_hour = models.FloatField(verbose_name = _("Working time"))
week = models.IntegerField(verbose_name = "working week") …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Django Rest Framework 序列化程序为我的前端创建 API,以在商店中创建/更新和删除文章。这些文章可以有多个价格(取决于时间)。因此,商品(一)与价格(多)之间存在一对多关系。我已在中定义了这一点models.py:
class Article(models.Model):\n article_id = models.AutoField(primary_key=True, verbose_name="Article ID")\n article_name = models.CharField(max_length=250, verbose_name="Name")\n article_order = models.IntegerField(verbose_name="Order")\n\nclass Price(models.Model):\n price_id = models.AutoField(primary_key=True, verbose_name="Price ID")\n article_id = models.ForeignKey(Article, on_delete=models.CASCADE, verbose_name="Article ID", related_name="Prices")\n price_price = models.DecimalField(max_digits=6, decimal_places=2, verbose_name="Price")\nRun Code Online (Sandbox Code Playgroud)\n\n我的serializers.py 文件如下所示:
\n\nfrom rest_framework import serializers\nfrom .models import *\n\nclass PriceSerializer(serializers.ModelSerializer):\n\n class Meta:\n model = Price\n fields = (\'price_price\',)\n\nclass ArticleSerializer(serializers.ModelSerializer):\n\n Prices = PriceSerializer(many=True)\n\n def create(self, validated_data):\n prices_data = validated_data.pop(\'Prices\')\n article = Article.objects.create(**validated_data)\n for price_data in prices_data:\n Price.objects.create(article_id=article, **price_data)\n …Run Code Online (Sandbox Code Playgroud) 这是情况。我的 Django REST API 上有一个列表:/playerslist/
它返回给我一个像这样的球员名单:
这正是我目前想要的。但现在,我需要这个:
Going for/playerslist/1/为我提供了不同的玩家编号 1 信息。这里的列表仅用于列出具有基本信息的玩家。但是我需要玩家的详细视图,包含来自其他模型的信息并具有不同的序列化,这一定是一个基本问题,但由于我对 Django 和 Python 总体而言是全新的,我必须误解一些东西。
这是我的视图集:
class PlayersListViewSet(viewsets.ModelViewSet):
queryset = Player.objects.all()
serializer_class = PlayersListSerializer
http_method_names = ['get', 'post']
pagination_class = None
filter_backends = [filters.OrderingFilter]
ordering_fields = ['name']
def get_queryset(self):
queryset = Player.objects.all()
team_id = self.request.query_params.get('team', None)
if team_id:
try:
queryset = queryset.filter(team=team_id)
except ValueError:
raise exceptions.ParseError()
return queryset
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?我必须使用@detail_route类似的东西playerslist/1/detail吗?我已经尝试过,但 DRF 的文档只显示了一个示例,对我来说根本不清楚。
python django django-queryset django-serializer django-rest-framework
我有一个带有选择 charfield 的模型字段
class Vehicle(models.Model):
name = models.CharField(max_length=100)
STATUS_CHOICES = (
("N", "New"),
("U", "Used"),
("P", "Just Purchased")
)
status = models.CharField(max_length=3, choices=STATUS_CHOICES)
Run Code Online (Sandbox Code Playgroud)
序列化器类也有用于状态的字符字段,但带有source显示可读值的参数
class VehicleSerializer(ModelSerializer):
status = serializers.CharField(source='get_status_display')
class Meta:
model = Vehicle
Run Code Online (Sandbox Code Playgroud)
当我尝试通过带有数据的补丁请求更新车辆时{'status': "U"},没有执行更新。但是,当我source从序列化程序状态字段中删除时会发生更新。必须提供来源才能在 Web 视图中显示正确的值。
我知道将序列化程序中的状态名称更改为其他名称并在模板中使用该名称的选项。还有一个选项可以覆盖序列化程序中的更新方法,但是我的问题是源代码在做什么来阻止更新?
我正在使用序列化器中的数据验证来验证 django 的其余框架中的请求中的数据。我需要在单个响应中发送所有错误消息。
在发送太长的字符串时,我收到错误:
django.db.utils.DataError: value too long for type character varying(3)
Run Code Online (Sandbox Code Playgroud)
在我的模型中,我将字符字段的最大长度定义为 3(理论上需要的最大长度)。
我在序列化器中添加了验证以捕获包含太多字符的请求:
验证器.py
class CustomUserValidators():
errors_to_return = {}
def val_role(self, role):
if len(role) > 3:
self.errors_to_return["role_length"] = "Ensure this field has no more than 3 characters."
Run Code Online (Sandbox Code Playgroud)
序列化器.py
from Sea.validators import CustomUserValidators
class LagoonUserCreateSerializer(UserCreateSerializer, CustomUserValidators):
class Meta:
model = User
fields = ('id', 'username', 'role',)
def validate(self, attrs):
self.val_role(attrs['role'])
if len(self.errors_to_return) > 0:
raise serializers.ValidationError(self.errors_to_return)
return attrs
Run Code Online (Sandbox Code Playgroud)
模型.py
class SeaUser(AbstractUser):
...
role = models.CharField(_('Role'), max_length=3)
Run Code Online (Sandbox Code Playgroud)
但请求仍然返回错误(value too …
python django django-models django-serializer django-rest-framework