Flask-SQLAlchemy - структура модели для статистики бейсбола и ID-> поиск имени - PullRequest
0 голосов
/ 25 сентября 2019

Я довольно новичок в Python и Flask-SQLAlchemy.У меня есть ряд статистических данных по бейсболу из API бейсбола Yahoo Fantasy, которые я хотел бы сохранить в своей базе данных.Я борюсь с тем, как структурировать свои модели на основе информации JSON, которую я получаю от Yahoo.В частности, одной из областей является то, что Yahoo представляет все свои саты с полем stat_id.Затем таблица используется для сопоставления этого stat_id со строковым именем статистики (display_name), когда оно отображается пользователю.Я хотел бы сделать что-то похожее в моих моделях, однако я не уверен, что мне нужно только сохранить stat_id (целые числа) в моей базе данных, а затем искать их в моем коде Python.Или просто сохраните имя в моей модели с каждой статистической записью за определенный день.Если я сделаю это в своем коде Python, мне кажется, что это дало бы мне больше гибкости, если бы отображения ID-> имен когда-либо изменились в будущем.

Если бы кто-то мог дать мне некоторое руководство по разумной структуре моделидля информации JSON ниже это будет высоко ценится.Я также предоставил фрагмент моей текущей структуры модели (без сопоставления ID-> Name).

Вот фрагмент данных json, которые я пытаюсь сохранить:

Статистические данные Записи

"settings": [
                {
    "stat_categories": {
                    "stats": [
                        {
                            "stat": {
                                "display_name": "H/AB",
                                "enabled": "1",
                                "is_only_display_stat": "1",
                                "name": "Hits / At Bats",
                                "position_type": "B",
                                "sort_order": "1",
                                "stat_id": 60,
                                "stat_position_types": [
                                    {
                                        "stat_position_type": {
                                            "is_only_display_stat": "1",
                                            "position_type": "B"
                                        }
                                    }
                                ]
                            }
                        },
                        {
                            "stat": {
                                "display_name": "R",
                                "enabled": "1",
                                "name": "Runs",
                                "position_type": "B",
                                "sort_order": "1",
                                "stat_id": 7,
                                "stat_position_types": [
                                    {
                                        "stat_position_type": {
                                            "position_type": "B"
                                        }
                                    }
                                ]
                            }
                        },
                        {
                            "stat": {
                                "display_name": "HR",
                                "enabled": "1",
                                "name": "Home Runs",
                                "position_type": "B",
                                "sort_order": "1",
                                "stat_id": 12,
                                "stat_position_types": [
                                    {
                                        "stat_position_type": {
                                            "position_type": "B"
                                        }
                                    }
                                ]
                            }
                        },
                    },
                },
            ]

Записанная статистика команды

"team": [
    [
            {
                "team_key": "388.l.73931.t.9"
            },
            {
                "team_id": "9"
            },
    ],
    {
        "team_stats": {
            "coverage_type": "week",
            "stats": [
                {
                    "stat": {
                        "stat_id": "60",
                        "value": "58/235"
                    }
                },
                {
                    "stat": {
                        "stat_id": "7",
                        "value": "31"
                    }
                },
                {
                    "stat": {
                        "stat_id": "12",
                        "value": "13"
                    }
                },
            ],
            "week": "3"
        }
    }
],

Мои модели в настоящее время выглядят так:

class Team(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    team_id = db.Column(db.Integer, nullable = False)
    team_key = db.Column(db.String(40), nullable = False)
    name = db.Column(db.String(20), unique=True, nullable=False)
    weekly_team_stats = db.relationship('Stat', secondary=weekly_team_stat_map)


class Stat(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    date = db.Column(db.DateTime, nullable=False, default=datetime.datetime)
    week = db.Column(db.Integer, nullable = True)
    stat_id = db.Column(db.Integer, nullable = False)
    value = db.Column(db.String(80), nullable=False)

weekly_team_stat_map = db.Table('weekly_team_stat_map',
                           db.Column('team_id', db.ForeignKey('team.id'), primary_key=True),
                           db.Column('stat_id', db.ForeignKey('stat.id'), primary_key=True)
                           )
...