【问题标题】:Django IntegrityError NOT NULL constraint failedDjango IntegrityError NOT NULL 约束失败
【发布时间】:2016-04-02 02:10:30
【问题描述】:

我有两张表 Topmost 和 Pincode:

class Pincode(models.Model):
    pincode = models.CharField("PinCode", max_length=6, null=False)
    geom = GeopositionField("Location")

class Topmost(models.Model):
     pincode = models.ForeignKey(Pincode, unique=True)
     rating_pincode = models.CharField("Total Rating points", max_length=255, null=True, blank=True)
     frequency = models.CharField("Number of user", max_length=255, null=True, blank=True)
     normalized_rank = models.FloatField(null=True, blank=True)

现在我想在创建新密码时创建一个自动进入最顶层。 所以在views.py中:

id_past_entries = Topmost.objects.all().values_list('pincode_id', flat=True)
    new_entries = Pincode.objects.exclude(id__in=id_past_entries).values_list('id', flat=True)

    for new_id in new_entries:
        new = Pincode.objects.get(id = new_id)
        Topmost.objects.create(pincode=new,rating_pincode=0, frequency=0, normalized_rank=0 )
        Topmost().save()

但它给出了错误

IntegrityError: NOT NULL 约束失败:display_topmost.pincode_id

有什么想法吗??

【问题讨论】:

    标签: django django-models django-views django-queryset


    【解决方案1】:

    我认为在这种情况下最好使用信号(https://docs.djangoproject.com/en/1.9/topics/signals/ ),从 view.py 中删除代码并在 models.py 中添加信号:

    from django.dispatch import receiver
    
    class Pincode(models.Model):
        pincode = models.CharField("PinCode", max_length=6, null=False)
        geom = GeopositionField("Location")
    
    class Topmost(models.Model):
        pincode = models.ForeignKey(Pincode, unique=True)
        rating_pincode = models.CharField("Total Rating points", max_length=255, null=True, blank=True)
        frequency = models.CharField("Number of user", max_length=255, null=True, blank=True)
        normalized_rank = models.FloatField(null=True, blank=True)
    
    @receiver(post_save, sender=Pincode)
    def create_topmost(sender, instance=None, created=False, **kwargs):
        if created:
           Topmost.objects.create(pincode=instance, rating_pincode="0", frequency="0", normalized_rank=0 )
    

    【讨论】:

      【解决方案2】:

      首先,你不应该做 TopMost().save() 因为 create 函数做同样的事情。其次,只需确保数据库中的所有 PinCode 都附加了一个 ID。这可能是非空约束存在完整性错误的原因。

      【讨论】:

        【解决方案3】:

        你为什么使用Topmost().save()

        Topmost.objects.create(pincode=new,rating_pincode=0, frequency=0, normalized_rank=0 ) 已经创建了你的对象

        【讨论】:

          猜你喜欢
          • 2020-12-19
          • 1970-01-01
          • 2023-03-20
          • 2023-03-29
          • 2020-06-28
          • 2019-02-14
          • 1970-01-01
          • 1970-01-01
          • 2022-08-10
          相关资源
          最近更新 更多