Django 在多个关系中保存默认字段
我的Django应用程序中有此型号的Django 在多个关系中保存默认字段,django,django-models,Django,Django Models,我的Django应用程序中有此型号的User: class User(AbstractBaseUser): email = models.EmailField(max_length=60, unique=True) username = models.CharField(max_length=60, unique=True) job = models.ManyToManyField(Job, blank=True, related_name="users",
User
:
class User(AbstractBaseUser):
email = models.EmailField(max_length=60, unique=True)
username = models.CharField(max_length=60, unique=True)
job = models.ManyToManyField(Job, blank=True, related_name="users", default = JobDefault)
它有一个字段,其中JobDefault()
返回一个字符串
def JobDefault():
return "Artist"
class Job(models.Model):
job = models.CharField(max_length=60, null=True, default = JobDefault())
def __str__(self):
return self.job
因此,有一个m2m
字段涉及User
和Job
但是如果用户没有指定作业,我想将默认的“艺术家”(即JobDefault()
返回的内容)设置为作业。Django似乎有一个bug,它阻止在每次创建实例时设置模型的初始值
我试图通过覆盖User
的save方法来实现这一点:
def save(self, *args, **kwargs):
if not self.job.all():
self.job.add(JobDefault())
super(User, self).save(*args, **kwargs)
但在尝试保存用户对象时返回错误:
raise ValueError('"%r" needs to have a value for field "%s" before '
ValueError: "<User: hello@gmail.com>" needs to have a value for field "id" before this many-to-many
relationship can be used
但在尝试运行任何manage.py
命令时返回此错误:
@receiver(post_save, sender=User, dispatch_uid='SetDefaultName')
NameError: name 'User' is not defined
有什么解决办法吗?谢谢
#编辑1
好吧,我试着:
def SetDefaultName(sender, instance, created, **kwargs):
if created:
instance.job.add(JobDefault())
print("Job been added!")
post_save.connect(SetDefaultName, sender=User)
但我有一个错误:
ValueError:字段“id”需要一个数字,但得到了“Artist”。
在信号中使用前导入用户
模型…@AbdulAzizBarkat信号已在用户
模型中。它应该在它之外吗?是的,信号应该在模型之外(出于某种原因,人们倾向于这样做,尽管这是一种不好的做法)。最好是将它们写入一个文件signals.py
,并将其导入应用程序配置类的ready
方法中。如果您需要一些参考资料,请在“简单”上选中此项。@AbdulAzizBarkat请参阅文章进行编辑。JobDefault()
返回字符串“艺术家”
您需要将作业
实例传递给方法instance.Job.add(此处为作业的实例)
。。。
def SetDefaultName(sender, instance, created, **kwargs):
if created:
instance.job.add(JobDefault())
print("Job been added!")
post_save.connect(SetDefaultName, sender=User)