我想向朋友们扩展用户模型,并用其他表(结构)中的字段作为外键..我将向您展示我的模型和创建超级用户后的错误
from django.db import models
from django.contrib.auth.models import User
from immob.models import structure
from django.db.models.signals import post_save
from django.dispatch import receiver
class Profile(models.Model):
User = models.OneToOneField(User, on_delete=models.CASCADE)
structure_id = models.ForeignKey(structure, on_delete=models.CASCADE, default=0)
@receiver(post_save, sender=User)
def create_user_utilisateur(sender, instance, created, **kwargs):
if created:
Profile.objects.create(User=instance)
@receiver(post_save, sender=User)
def save_user_utilisateur(sender, instance, **kwargs):
instance.profile.save()
错误消息:
[p-amc-dgps-er@192-168-150-254 Invest_App]$ python3 manage.py createsuperuser
Username (leave blank to use 'p-amc-dgps-er'): admin
Email address: admin@admin.dz
Password:
Password (again):
Error: Your passwords didn't match.
Password:
Password (again):
Traceback (most recent call last):
File "/usr/lib/python3.6/site-packages/django/db/backends/base/base.py", line 239, in _commit
return self.connection.commit()
psycopg2.errors.ForeignKeyViolation: ERREUR: une instruction insert ou update sur la table �� compte_profile �� viole la contrainte de cl��
��trang��re �� compte_utilisateur_structure_id_id_df7f99e8_fk_immob_str ��
DETAIL: La cl�� (structure_id_id)=(0) n'est pas pr��sente dans la table �� immob_structure ��.
答案 0 :(得分:0)
问题出在default=0
外键上的structure_id
上。如果没有structure
行具有此ID,则不能将默认值设置为0。因此,您必须问自己以下问题:
structure_id
是强制性的吗?如果不是,请添加blank=True, null=True
并不要设置默认值(将其设置为None
)。structure
对象,但这也意味着在迁移过程中,您需要先在数据库中创建一个structure
对象您可以创建Profile
表。您需要设置default=get_default_structure
并定义get_default_structure()
函数以返回所需的函数(例如return structure.objects.get(name='default')
)。注1:我建议您不要调用外键字段structure_id
,而应调用structure
,因为在您的python代码中,profile.structure_id
不会给您ID,而是实际的ID。 structure
个实例。看一下ForeignKey
的Django文档:在幕后,Django存储了id(并自动创建了structure_id
字段),但是对于开发人员来说,Django ForeignKeys可以处理实际的对象
注2:也不要调用用户字段User
,而是调用user
,因为在Profile
的命名空间中,您实际上是在使用User
重新定义类骆驼香烟盒。 Python实例变量和类属性应始终为小写(snake_case)。只有类名是大写的(CamelCase)。