python - 非空约束失败。Django Models-Postgres 相同的错误 null=True 与 null=False
问题描述
我很难更新与外键链接的这三个模型它们与外键链接的原因是事件可以有多个市场,市场可以有多个跑步者。
对于这个非空错误,我束手无策。即使我有一个导致问题的字段并且我从我的模型中删除了该字段。进行迁移,迁移并从我的任务中删除保存我仍然得到完全相同的错误。这个非空参数的目的是什么?即使我在全新型号上使用 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)
任务.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()
解决方案
随着线
Ma.objects.update_or_create(market_id=market_id)
你还没有Event
为你的市场对象设置。鉴于如何
event = models.ForeignKey(Event, on_delete=models.CASCADE)
没有null=True
,它不会接受任何空值。
推荐阅读
- python - Python groupby 在多列上使用
- swift - 以匹配指南针旋转数据的速率连续旋转图形
- c# - Blazor(服务器)中的奇怪行为(html 元素消失),可能是 blazor.server.js
- reactjs - Nginx 在我的 react-app 上抛出 404 错误
- kotlin - 如何在 Kotlin 中将十六进制字符串转换为十进制字符串?
- javascript - 如何计算某个单词在 JavaScript 中充满文本的 div 中出现的次数?
- python - 如何从 Python 中的测试数据进行插值?2组输入
- amazon-cognito - 如何将 AWS Cognito 本机用户链接到联合用户
- java - 为什么在执行 Java Stream 终端操作时对象没有被垃圾收集?
- python - Keras 自定义数据生成器通过多输入和多输出提供维度错误(功能性 api 模型)