Django使用' __ init __'创建新的模型实例。表中的函数,实例数据是错误的吗?

时间:2017-03-29 08:29:58

标签: python django orm

我的模型代码存在问题:

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(...)创建新实例, 我要改变我的代码吗?

那么从表数据创建新实例的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

您根本不应在模型上定义__init__。基类 - 您通过super调用 - 已经设置了kwargs的属性。删除该方法。

答案 1 :(得分:1)

  

那么从表数据创建新实例的最佳方法是什么?

你拥有它,最好的方法是使用MyModel.objects.create来处理所有参数,自动设置主键并返回实例。

第二种方式是:

my_model = MyModel(...)
my_model.save()

如果您想了解测试问题

这是您定义的实例属性,例如self.name = name。当你为它分配第一个参数时,你实际上正在分配id(由场景后面的Django ORM传递给原始的__init__

故事的道德

不要重新发明轮子,这些属性已经由Django设置。