【问题标题】:Not null constraint failed. Django Models-Postgres Same error null=True as null=False非空约束失败。 Django Models-Postgres 相同的错误 null=True 与 null=False
【发布时间】:2019-11-12 05:21:15
【问题描述】:

我在更新这三个与外键链接的模型时遇到了困难 它们与外键链接的原因是事件可以有多个市场,市场可以有多个跑步者。

这个非空错误让我束手无策。即使我有一个导致问题的字段并且我从我的模型中删除了该字段。进行迁移,迁移并从我的任务中删除保存我仍然得到完全相同的错误。这个非空参数的目的是什么?即使我在全新型号上使用 null=True 或 null=False,我仍然会收到错误消息。 非空约束失败

django.db.utils.IntegrityError: NOT NULL constraint failed: testapp_ma.event_id

我不知道为什么会失败。

我需要确保所有字段都有一个空参数吗?根据 django 文档,默认值为 false。对于我的任务运行的每个对象,所有字段都有数据。所以默认 false 应该没问题。 这可能是由于我使用我的任务更新模型的方式吗?

完整的堆栈跟踪在这里https://gist.github.com/Cally99/08fed46ba8039fa65d00f53e8a31b37a

class Event(models.Model):
    sport_name = models.CharField(max_length=15)
    event_id = models.BigIntegerField(unique=True, null=False)
    event_name = models.CharField(max_length=200)
    start_time = models.DateTimeField()
    status = models.CharField(max_length=13)

class Market(models.Model):
    event = models.ForeignKey(Event, on_delete=models.CASCADE)
    market_id = models.BigIntegerField(unique=True)
    market_name = models.CharField(max_length=35)
    status = models.CharField(max_length=10)
    volume = models.FloatField(null=True)

class Runner(models.Model):
    market = models.ForeignKey(Market, null=True, default=None, on_delete=models.SET_NULL)
    runner_id = models.BigIntegerField(unique=True)
    event_id = models.BigIntegerField(null=True, default=0)
    name = models.CharField(max_length=100)

tasks.py

@shared_task(bind=True)
def get_events(self):

    api = get_client()
    events = api.market_data.get_events(sport_ids=[9],states=MarketStates.All,
                                                        per_page=200, offset=0,
                                                        include_event_participants=Boolean.T,
                                                        category_ids=None, price_depth=3,
                                                        side=Side.All, session=None)

    for event in events:
        event_name = event["name"]
        event_id = event['id']
        start_time = event['start']
        status = event["status"]

        ev, created = Ev.objects.update_or_create(event_id=event_id)

        ev.event_name = event_name
        ev.start_time = start_time
        ev.status = status
        ev.save()

        markets = event["markets"]
        for market in markets:
            event_id = market['event-id']
            market_id = market['id']
            market_name = market['name']
            status = market['status']
            volume = market['volume']

            ma, created = Ma.objects.update_or_create(market_id=market_id)
            ma.market_name = market_name
            ma.status = status
            ma.volume = volume
            ma.save()

            runners = market["runners"]
            for runner in runners:
                name = runner['name']
                runner_id = runner['id']
                event_id = runner['event-id']

                runner, created = Ru.objects.update_or_create(runner_id=runner_id)
                runner.event_id = event_id
                runner.name = name
                runner.save() 

【问题讨论】:

  • 这是堆栈跟踪的相关行。 File "/Users/mac/PycharmProjects/testmbfunctions/testpro/testapp/tasks.py", line 43, in get_events ma, created = Ma.objects.update_or_create(market_id=market_id).

标签: python sql django postgresql


【解决方案1】:

随行

Ma.objects.update_or_create(market_id=market_id)

您尚未为您的市场对象设置Event。并考虑到如何

event = models.ForeignKey(Event, on_delete=models.CASCADE)

没有null=True,它不会接受任何空值。

【讨论】:

  • 如何在市场对象上设置事件?写入模型时是否在任务中完成?
  • Ma.objects.update_or_create(event=ev, market_id=market_id)
  • 谢谢,我不知道我需要在任务中设置事件对象才能更新模型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-09
  • 2014-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多