Django - 如何将模型字段重置为其默认值?

时间:2010-07-12 15:14:19

标签: django django-models

将某个模型实例的所有字段重置为默认值的最优雅\有效方法是什么?

7 个答案:

答案 0 :(得分:6)

我曾经这样做过。我无法想到更好的方式。

from django.db.models.fields import NOT_PROVIDED

for f in instance._meta.fields:
    if f.default <> NOT_PROVIDED:
        setattr(instance, f.name, f.default)

# treatment of None values, in your words, to handle fields not marked with null=True
...
...
# treatment ends

instance.save()

注意:在我的情况下,所有字段都有默认值。

希望它会有所帮助。快乐的编码。

答案 1 :(得分:3)

def reset( self, fields=[], exclude=[] ):

    fields = fields or filter( lambda x: x.name in fields, self._meta.fields )
    exclude.append( 'id' )        

    for f in filter( lambda x: x.name not in exclude, fields ):
        if getattr( f, 'auto_now_add', False ):
            continue

        if f.blank or f.has_default():
            setattr( self, f.name, f.get_default() )

答案 2 :(得分:1)

None分配给字段,然后保存。

答案 3 :(得分:1)

此方法主要适用于将单个值重置为默认值,但可以进行调整。它会重置所有rego_update个对象的Event属性。

Event.objects.all().update(rego_update=Event().rego_update)

或者,单独应用它(即触发自定义save方法):

default = Event().rego_update  # Hack to fetch the default
for event in Event.objects.all():
    event.rego_update = default
    event.save()

要使其适应重置单个实例的所有值,您可以使用默认值手动重置每个值。

或者,你可以在这里循环浏览类似于其他答案的属性,但是这会出现没有默认(或无法编辑)的字段的问题。

答案 4 :(得分:0)

在您对该实例进行了更改之后,在您“保存”之前,我认为?我认为您可能需要从数据库中重新检索它...我不认为Django模型实例会保留对实例所做更改的“历史记录”。

答案 5 :(得分:0)

通过选中.null字段属性为所有不可空的字段分配无:

for name, value in {f.name: None for f in self._meta.fields if f.null}:
    setattr(instance, name, value)
instance.save()

答案 6 :(得分:0)

您可以使用var tagsByProduct = await context.ProductTags .Where(item => item.Product.Name == "ProductName") .Select(item => new { Id = item.Tag.Id, Description = item.Tag.Description }) .ToListAsync();

请注意,您应将其包装为try / except,而根据您的Django版本self.your_field =self.__class__._meta.get_field('your_field').default可能会使用其他名称