我的模型代码存在问题:
class Person(models.Model):
name = models.CharField(max_length=20)
url = models.URLField()
card_id = models.CharField(max_length=20)
def __init__(self, name, card_id, url, *args, **kwargs):
super().__init__(*args, **kwargs)
self.name = name
self.card_id = card_id
self.url = url
def __str__(self):
return str({
'name': self.name,
'card_id': self.card_id,
'url': self.url
})
有测试代码:
class PersonTestCase(TestCase):
def setUp(self):
Person.objects.create(name="test",
card_id="123",
url="http://www.baidu.com")
def test_get(self):
p = Person.objects.get(name="test")
print(p)
测试功能的打印' test_get'是:
{'name': 1, 'card_id': 'test', 'url': '123'}
这是错误。
name
的值是表格中id
列的数据,
card_id
的值是表格中name
列的数据,
...
但如果我更改功能__init__
,请执行以下操作:
def __init__(self, id=None, name=None, card_id=None, url=None, *args, **kwargs):
或删除函数__init__
,获取函数test_get
的打印是:
{'name': 'test', 'card_id': '123', 'url': 'http://www.baidu.com'}
这是对的。
在某个地方,我使用Person(....)
创建新实例,如果我删除__init__
,则表示我无法使用Person(...)
创建新实例,
我要改变我的代码吗?
那么从表数据创建新实例的最佳方法是什么?
答案 0 :(得分:1)
您根本不应在模型上定义__init__
。基类 - 您通过super
调用 - 已经设置了kwargs的属性。删除该方法。
答案 1 :(得分:1)
那么从表数据创建新实例的最佳方法是什么?
你拥有它,最好的方法是使用MyModel.objects.create
来处理所有参数,自动设置主键并返回实例。
第二种方式是:
my_model = MyModel(...)
my_model.save()
如果您想了解测试问题
这是您定义的实例属性,例如self.name = name
。当你为它分配第一个参数时,你实际上正在分配id
(由场景后面的Django ORM传递给原始的__init__
)
故事的道德
不要重新发明轮子,这些属性已经由Django设置。