将某个模型实例的所有字段重置为默认值的最优雅\有效方法是什么?
答案 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
可能会使用其他名称