From a270995bf3c6f63e22f071b415f2873302788332 Mon Sep 17 00:00:00 2001 From: bijirin Date: Sat, 16 May 2026 23:05:13 +0700 Subject: [PATCH 1/3] Implement game database --- db/migrations/0001_initial.py | 52 +++++++++++++++++++++++++++++++++++ db/models.py | 25 +++++++++++++++++ main.py | 34 ++++++++++++++++++++++- 3 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 db/migrations/0001_initial.py diff --git a/db/migrations/0001_initial.py b/db/migrations/0001_initial.py new file mode 100644 index 000000000..b8b49f906 --- /dev/null +++ b/db/migrations/0001_initial.py @@ -0,0 +1,52 @@ +# Generated by Django 6.0.4 on 2026-05-16 10:20 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Guild', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255, unique=True)), + ('description', models.TextField(null=True)), + ], + ), + migrations.CreateModel( + name='Race', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255, unique=True)), + ('description', models.TextField(blank=True)), + ], + ), + migrations.CreateModel( + name='Player', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('nickname', models.CharField(max_length=255, unique=True)), + ('email', models.EmailField(max_length=254)), + ('bio', models.CharField(max_length=255)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('guild', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='db.guild')), + ('race', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='db.race')), + ], + ), + migrations.CreateModel( + name='Skill', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255, unique=True)), + ('bonus', models.CharField(max_length=255)), + ('race', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='db.race')), + ], + ), + ] diff --git a/db/models.py b/db/models.py index 137941ffa..24535db3e 100644 --- a/db/models.py +++ b/db/models.py @@ -1 +1,26 @@ from django.db import models + + +class Race(models.Model): + name = models.CharField(max_length=255, unique=True) + description = models.TextField(blank=True) + + +class Skill(models.Model): + name = models.CharField(max_length=255, unique=True) + bonus = models.CharField(max_length=255) + race = models.ForeignKey(Race, on_delete=models.CASCADE) + + +class Guild(models.Model): + name = models.CharField(max_length=255, unique=True) + description = models.TextField(null=True) + + +class Player(models.Model): + nickname = models.CharField(max_length=255, unique=True) + email = models.EmailField(unique=False) + bio = models.CharField(max_length=255) + race = models.ForeignKey(Race, on_delete=models.CASCADE) + guild = models.ForeignKey(Guild, on_delete=models.SET_NULL, null=True) + created_at = models.DateTimeField(auto_now_add=True) diff --git a/main.py b/main.py index e71f55d89..8bdeb92b4 100644 --- a/main.py +++ b/main.py @@ -1,10 +1,42 @@ import init_django_orm # noqa: F401 +import json from db.models import Race, Skill, Player, Guild def main() -> None: - pass + with open("players.json", "r") as file: + players = json.load(file) + + for key, value in players.items(): + + player_race, created = Race.objects.get_or_create( + name=value["race"]["name"], + description=value["race"]["description"], + ) + + for skill in value["race"]["skills"]: + Skill.objects.get_or_create( + name=skill["name"], + bonus=skill["bonus"], + race=player_race, + ) + + if value["guild"] is None: + player_guild = None + else: + player_guild, created = Guild.objects.get_or_create( + name=value["guild"]["name"], + description=value["guild"]["description"], + ) + + Player.objects.get_or_create( + nickname=key, + email=value["email"], + bio=value["bio"], + race=player_race, + guild=player_guild, + ) if __name__ == "__main__": From 0da615e6955b50849f5bed56ecdd2e34ef75d9fb Mon Sep 17 00:00:00 2001 From: bijirin Date: Sat, 16 May 2026 23:15:17 +0700 Subject: [PATCH 2/3] Corrected missing related_name on ForeignKeys fields --- db/models.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/db/models.py b/db/models.py index 24535db3e..d2aca038d 100644 --- a/db/models.py +++ b/db/models.py @@ -9,7 +9,11 @@ class Race(models.Model): class Skill(models.Model): name = models.CharField(max_length=255, unique=True) bonus = models.CharField(max_length=255) - race = models.ForeignKey(Race, on_delete=models.CASCADE) + race = models.ForeignKey( + Race, + related_name="skills", + on_delete=models.CASCADE + ) class Guild(models.Model): @@ -21,6 +25,14 @@ class Player(models.Model): nickname = models.CharField(max_length=255, unique=True) email = models.EmailField(unique=False) bio = models.CharField(max_length=255) - race = models.ForeignKey(Race, on_delete=models.CASCADE) - guild = models.ForeignKey(Guild, on_delete=models.SET_NULL, null=True) + race = models.ForeignKey( + Race, + related_name="players", + on_delete=models.CASCADE + ) + guild = models.ForeignKey( + Guild, + related_name="members", + on_delete=models.SET_NULL, null=True + ) created_at = models.DateTimeField(auto_now_add=True) From 64872cd95ba17260e103891fb2b26e0ba4501120 Mon Sep 17 00:00:00 2001 From: bijirin Date: Sat, 16 May 2026 23:17:57 +0700 Subject: [PATCH 3/3] Corrected missing related_name on ForeignKeys fields - adding migration file --- ...player_guild_alter_player_race_and_more.py | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 db/migrations/0002_alter_player_guild_alter_player_race_and_more.py diff --git a/db/migrations/0002_alter_player_guild_alter_player_race_and_more.py b/db/migrations/0002_alter_player_guild_alter_player_race_and_more.py new file mode 100644 index 000000000..1fb8abc0d --- /dev/null +++ b/db/migrations/0002_alter_player_guild_alter_player_race_and_more.py @@ -0,0 +1,29 @@ +# Generated by Django 6.0.4 on 2026-05-16 11:17 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('db', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='player', + name='guild', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='members', to='db.guild'), + ), + migrations.AlterField( + model_name='player', + name='race', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='players', to='db.race'), + ), + migrations.AlterField( + model_name='skill', + name='race', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='skills', to='db.race'), + ), + ]