Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 在多个关系中保存默认字段_Django_Django Models - Fatal编程技术网

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",

我的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", 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)