1

有人可以向我解释一下created,以及它在 django 中的使用位置和方式。

我已经看到它在这样的情况下使用:

obj, created = Person.objects.get_or_create(first_name=’John’, last_name=’Lennon’, defaults={’birthday’: date(1940, 10, 9)})

甚至在信号中:

@receiver(post_save, sender=Article)
def create_approval(sender, **kwargs):
    if kwargs.get("created", False):
        approval = Approval.objects.create(article_id=kwargs.get('instance').id)

我真的需要知道这一点。任何帮助都感激不尽。谢谢你。

编辑:

在这里,从上面的代码:

    if kwargs.get("created", False):

这里是什么created意思?它是否指定createdas的值False。或者是什么?

4

2 回答 2

4

Django 的模型提供了一个名为 的便捷方法get_or_create,它根据指定的条件(在 中)查找对象kwargs。如果条件不匹配,则创建一个新对象。

现在,我们无法在视图中确定返回的对象是创建的还是预先存在的(特别是如果您没有created_datetime或类似的字段),因此created. 它是一个布尔变量,True如果 ORM 创建了一个新对象,则设置为,False如果检索到现有对象,则设置为。

现在,在您的场景中:

obj, created = Person.objects.get_or_create(first_name=’John’, last_name=’Lennon’, defaults={’birthday’: date(1940, 10, 9)})

这就是说,把Person对象拿给我first_name = John, last_name = Lennon, birthday = ...

如果找不到,请为我创建一个新的。

在这种情况下创建对象时defaults指定字段的初始值。birthday

这也相当于写

obj = None
try:
    obj = Person.objects.get(first_name=’John’, last_name=’Lennon’)
except Person.DoesNotExist:
    obj = Person.objects.create(’birthday’ = date(1940, 10, 9), first_name='John', last_name = 'Lennon')

在信号的接收器中,kwargs是一个带有自定义键值对的字典。当您查看信号的文档时,假设post_save具有以下签名

django.db.models.signals.post_save

post_save(sender, instance, created, raw, using, update_fields)

这和

post_save(sender, **kwargs) #where the rest of the args are a dictionary saved in **kwargs

在这里,created也有类似的含义。它通知信号instance是新创建的还是更新的。

因此,如果created = True,则创建了新对象。created=False, 对象可能已更新。

于 2013-11-10T13:16:06.647 回答
0

created是 get_or_create() 的布尔返回变量。如果对象是使用 get_or_create() 调用创建的(SQL INSERT),则为True,如果不是(使用 SELECT 获取对象),则为False

第二个:MyModel.objects.create() 强制创建(INSERT)。

于 2013-11-10T11:46:13.380 回答