我有一对一扩展用户模型的问题

时间:2019-07-23 08:45:57

标签: django

我想向朋友们扩展用户模型,并用其他表(结构)中的字段作为外键..我将向您展示我的模型和创建超级用户后的错误

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 ��.

1 个答案:

答案 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)。