如何使用带有Django的外键将模型链接在一起?

2024-04-20 08:18:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用一个task函数更新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)

Tags: nameeventidtruetimemodelsstatusmarket