python - 如何使用外键和 Django 将模型链接在一起?
问题描述
我正在尝试使用任务功能更新 django 中的三个模型,并使用外键将它们链接在一起。事件,市场和赛跑者
我希望能够在我的视图中查询数据并显示数据。
一个赛事有多个市场,每个市场都有多个参赛者。
当我尝试使用外键将三个模型链接在一起时出现错误。
django.db.utils.ProgrammingError: relation "apimb_event" does not exist
STATEMENT: SELECT "apimb_event"."event_id", "apimb_event"."event_name", "apimb_event"."start_time", "apimb_event"."status" FROM "apimb_event" ORDER BY "apimb_event"."event_id" DESC LIMIT 21
更新: 对数据库进行核对并重新开始后,我遇到了类似的错误。
apimb.models.DoesNotExist: Market matching query does not exist.
psycopg2.errors.NotNullViolation: null value in column "event_id"
violates not-null constraint DETAIL: Failing row contains
(1271204194200017, null, null, null, null).
我认为我没有正确使用外键。每个模型都有一个 id 作为主键。我可以在不使用外键的情况下更新和创建这些数据,但是,如何更新模型然后查询数据以显示如下?
Event Market Runner
event_name_1 market_name_1 runner_name_1
runner_name_2
runner_name_3
event_name_1 market_name_2 runner_name_1
runner_name_2
runner_name_3
runner_name_4
任务功能
@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 = Event.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 = Market.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:
runner_name = runner['name']
runner_id = runner['id']
event_id = runner['event-id']
runner, created = Runner.objects.update_or_create(runner_id=runner_id)
runner.event_id = event_id
runner.runner_name = runner_name
runner.save()
模型.py
class Event(models.Model):
event_id = models.BigIntegerField(primary_key=True)
event_name = models.CharField(max_length=200, null=True)
start_time = models.DateTimeField(null=True)
status = models.CharField(null=True, max_length=13)
class Market(models.Model):
event = models.ForeignKey(Event, on_delete=models.CASCADE)
market_id = models.BigIntegerField(primary_key=True)
market_name = models.CharField(null=True, max_length=35)
status = models.CharField(null=True, max_length=10)
volume = models.FloatField(null=True, max_length=15)
class Runner(models.Model):
market = models.ForeignKey(Market, null=True, on_delete=models.SET_NULL)
runner_id = models.BigIntegerField(primary_key=True)
event_id = models.BigIntegerField(null=True)
runner_name = models.CharField(max_length=100)
解决方案
推荐阅读
- flutter - 如何对基于回调的方法进行单元测试(Firebase 的 verifyPhoneNumber(...))
- svg - SVG 背景动画消耗大量 CPU (loading.io)
- php - 获取数组的最后一个元素以从中删除逗号
- arrays - 重复数组
- c++ - 将带参数的构造函数作为参数传递给另一个构造函数
- td-engine - TDengine 错误:“提交失败的数据库内存已满”
- image - 如何在 Matlab 中叠加具有多边形形状的图像?
- javascript - 如何将回调函数设置为 react-paginate 和 TypeScript 的道具?
- c++ - UE4 使用具有自己参数的函数作为参数,C++
- pandas - 如果循环一个数据框并在该循环内创建新列,它会是无穷无尽的吗?