且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Django Rest:仅在创建时的模型字段默认值

更新时间:2023-01-30 10:28:02

通过覆盖模型的保存功能也可以实现相同的模式。确保在创建模型时,在您的情况下,为id和key赋予一个值(默认值)。

  class UsersModel(models.Model):
id = models.CharField(db_column =id,max_length = 25,primary_key = True)
key = models.CharField(db_column =key,max_length = 100)
a = models.CharField(db_column =a,max_length = 25,null = True,blank = True)
b = models.BigIntegerField(db_column =b,null = True,blank = True)

def save():
如果不是self.id:
self.id = get_default('id')
如果不是self.key:
self.key = get_default('key')
super(UsersModel,self).save(* args,** kwargs)

这将确保您创建和更新时, t save save被调用,这些变量在获取保存在db中之前被分配一个默认值。


I have a model with 2 char-fields. I want to give them default values when a row is getting created. This default values are sort of IDs which depends on time. This ID should never change. i.e. the default value should not be applied when subsequent updates happen on the row.

I'm trying to use update_or_create but, the defaults while creating & updating are not same. How can I put these Ids only while creating and ignore while updating?

I'm referring to this answer but no luck.

EDIT:

Following is the code for reference:

Model:

class UsersModel(models.Model):
    id = models.CharField(db_column="id", max_length=25, primary_key=True)
    key = models.CharField(db_column="key", max_length=100)
    a = models.CharField(db_column="a",max_length=25, null=True, blank=True)
    b = models.BigIntegerField(db_column="b", null=True, blank=True)

Views:

def post(self, request, format=None):
    UsersModel.objects.update_or_create(a="a_val",defaults={"b":"b_val"})

Here, I want the id & key to take default values when the row is being created. When it is being updated, only b should get updated as shown in above code.

The same can be achieved by overiding the save function of models.Model to ensure that an id and key is given a value(default) in your case if the model is being created.

class UsersModel(models.Model):
    id = models.CharField(db_column="id", max_length=25, primary_key=True)
    key = models.CharField(db_column="key", max_length=100)
    a = models.CharField(db_column="a",max_length=25, null=True, blank=True)
    b = models.BigIntegerField(db_column="b", null=True, blank=True)

    def save():
        if not self.id:
            self.id=get_default('id')
        if not self.key:
            self.key=get_default('key')
        super(UsersModel, self).save(*args, **kwargs)

This will ensure when you create and update, the first time save is called, these variables are assigned a default value before getting saved in the db.