我有以下包含JSONField的django模型:
class RatebookDataEntry(models.Model):
data = JSONField(blank=True, default=[])
last_update = models.DateTimeField(auto_now=True)
class Meta:
verbose_name_plural = 'Ratebook data entries'
Run Code Online (Sandbox Code Playgroud)
而数据字段包含此JSON:
{
"annual_mileage": 15000,
"description": "LEON DIESEL SPORT COUPE",
"body_style": "Coupe",
"range_name": "LEON",
"co2_gkm_max": 122,
"manufacturer_name": "SEAT"
}
Run Code Online (Sandbox Code Playgroud)
我可以通过其中一个数据字段对查询集进行排序吗?此查询不起作用.
RatebookDataEntry.objects.all().order_by("data__manufacturer_name")
Run Code Online (Sandbox Code Playgroud) 从父类中的子类访问变量是否正确?这是一个很好的OOP方法吗?我不需要创建Animal类的实例,但是如果我愿意的话,该make_sound
方法会引发AttributeError
,这困扰着我.
class Animal:
def make_sound(self):
print(self.sound)
class Cat(Animal):
sound = 'meow'
class Dog(Animal):
sound = 'bark'
cat = Cat()
cat.make_sound()
dog = Dog()
dog.make_sound()
Run Code Online (Sandbox Code Playgroud) 为什么 pydantic 不验证 Foo 对象列表的参数,但当参数是基本类型列表时抛出 ValidationError ?
我可以强制执行复杂类型的验证吗?
验证不起作用:
from typing import List
from pydantic import BaseModel
class Foo(BaseModel):
kind: str = "foo"
class Bar(BaseModel):
kind: str = "bar"
class Spam(BaseModel):
foos: List[Foo]
spam = Spam(foos=[Bar()])
print(spam.dict())
>>> {'foos': [{'kind': 'bar'}]}
Run Code Online (Sandbox Code Playgroud)
验证工作:
class Spam(BaseModel):
foos: List[int]
spam = Spam(foos=[Bar()])
print(spam.dict())
pydantic.error_wrappers.ValidationError: 1 validation error for Spam
foos -> 0
value is not a valid integer (type=type_error.integer)
Run Code Online (Sandbox Code Playgroud) 有没有理由测试模型方法,或者我应该假设Django正常工作并让他们未经测试?
这是我的模型和几个方法:
class SlackTeam(models.Model):
...
def get_user(self, user_id):
return self.users.filter(user_id=user_id).first()
def deactivate(self):
self.active = False
self.initiator.access_token = ''
self.initiator.save()
self.initiator = None
self.deactivated_at = timezone.now()
self.save()
if hasattr(self, 'slackbot'):
self.slackbot.delete()
def set_initiator(self, user):
self.initiator = user
self.save(update_fields=['initiator'])
@classmethod
def initialize(cls, team_id, name):
return cls.objects.update_or_create(
team_id=team_id, defaults={'name': name})[0]
@classmethod
def get_by_team_id(cls, team_id):
return cls.objects.filter(team_id=team_id).first()
Run Code Online (Sandbox Code Playgroud) python ×4
django ×2
class ×1
django-1.9 ×1
oop ×1
pydantic ×1
testing ×1
unit-testing ×1
validation ×1