代码之家  ›  专栏  ›  技术社区  ›  Micah Pearce

Djano 2.0:外键约束

  •  0
  • Micah Pearce  · 技术社区  · 6 年前

    当我试图创建一个新的模型实例时,我一直得到一个外键约束。我可以在管理员那里很好地完成这项工作,但这并不是在代码方面工作。我曾经拿过这个 Thing 建模并移除到其他外键并将这两个外键放入,但我不知道这是否与此错误有关。你知道是什么造成这个外键错误吗?

    class ThingManager(models.Manager):
      def new(self,thing_a=None,thing_b=None):
        return self.model.objects.create(thing_a=thing_a, thing_b=thing_b)
    
    class Thing(models.Model):
        thing_a= models.ForeignKey(BillingProfile, blank=False, related_name='thinga+', default=False, on_delete=models.CASCADE)
        thing_b= models.ForeignKey(BillingProfile, blank=False, related_name='thingb+',default=False, on_delete=models.CASCADE)
        thing_c = models.ForeignKey(BillingProfile, blank=True, related_name='thingc+',default=False, on_delete=models.CASCADE,null=True)
        thing_id = models.CharField(max_length=120, blank=True)
    
        def __str__(self):
            return self.thing_id
    
        objects = ThingManager()
    

    BillingPorfile 只是用户配置文件的扩展

    class BillingProfile(models.Model):
        user        = models.OneToOneField(User, null=True, blank=True, on_delete=models.CASCADE)
        email       = models.EmailField()
    

    创建错误的代码:

    bp1 = BillingProfile.objects.filter(user__email='a@gmail.com')
    bp2 = BillingProfile.objects.filter(user__email='b@yahoo.com')
    qs = Thing.objects.new(thing_a=bp1.first(),thing_b=bp2.first())
    

    错误消息:

     Traceback (most recent call last):
          File "<console>", line 1, in <module>
          File "C:myapp\src\thing\models.py", line 38, in new
            return self.model.objects.create(thing_a=thing_a, thing_b=thing_b)
          File "C:myapp\lib\site-packages\django\db\models\manager.py", line 82, in manager_method
            return getattr(self.get_queryset(), name)(*args, **kwargs)
          File "C:myapp\lib\site-packages\django\db\models\query.py", line 417, in create
            obj.save(force_insert=True, using=self.db)
          File "C:myapp\lib\site-packages\django\db\models\base.py", line 729, in save
            force_update=force_update, update_fields=update_fields)
          File "C:myapp\lib\site-packages\django\db\models\base.py", line 759, in save_base
            updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
          File "C:myapp\lib\site-packages\django\db\transaction.py", line 212, in __exit__
            connection.commit()
          File "C:myapp\lib\site-packages\django\db\backends\base\base.py", line 261, in commit
            self._commit()
          File "C:myapp\lib\site-packages\django\db\backends\base\base.py", line 239, in _commit
            return self.connection.commit()
          File "C:myapp\lib\site-packages\django\db\utils.py", line 89, in __exit__
            raise dj_exc_value.with_traceback(traceback) from exc_value
          File "C:myapp\lib\site-packages\django\db\backends\base\base.py", line 239, in _commit
            return self.connection.commit()
        django.db.utils.IntegrityError: FOREIGN KEY constraint failed
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Roman Yakubovich    6 年前

    可能问题在于 thing_c . 外键是对其他表列的引用,在这种情况下(在模型中既没有显式指定主键,也没有显式指定主键 to_field 属性 ForeignKey 字段)到 id 领域 BillingProfile ,所以它是某种整数,而不是布尔值。

    更改的默认值 事物 外键到 None . thing_a thing_b 默认值实际上应该删除,因为您没有指定 null=True 在这些领域。