From 31e121b091711dca5d228196ab554f2cac56d4b6 Mon Sep 17 00:00:00 2001 From: Nik Date: Wed, 13 May 2026 23:44:18 +0300 Subject: [PATCH 1/4] solution --- db/migrations/0001_initial.py | 52 +++++++++++++++++++++++++++++++++++ db/models.py | 38 +++++++++++++++++++++++++ main.py | 38 +++++++++++++++++++++++-- 3 files changed, 126 insertions(+), 2 deletions(-) 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..94725ef5b --- /dev/null +++ b/db/migrations/0001_initial.py @@ -0,0 +1,52 @@ +# Generated by Django 6.0.5 on 2026-05-13 15:34 + +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=255)), + ('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, related_name='guilds', to='db.guild')), + ('race', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='races', 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, related_name='skills', to='db.race')), + ], + ), + ] diff --git a/db/models.py b/db/models.py index 137941ffa..8dc3208be 100644 --- a/db/models.py +++ b/db/models.py @@ -1 +1,39 @@ 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, + related_name="skills" + ) + + +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(max_length=255) + bio = models.CharField(max_length=255) + race = models.ForeignKey( + Race, + on_delete=models.CASCADE, + related_name="races" + ) + guild = models.ForeignKey( + Guild, + on_delete=models.SET_NULL, + related_name="guilds", + null=True + ) + created_at = models.DateTimeField(auto_now_add=True) diff --git a/main.py b/main.py index e71f55d89..01d3fe49f 100644 --- a/main.py +++ b/main.py @@ -1,11 +1,45 @@ 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 nickname, player in players.items(): + race = player["race"] + race_obj, created = Race.objects.get_or_create( + name=race["name"], + defaults={ + "description": race["description"] + } + ) + for skill in race["skills"]: + Skill.objects.get_or_create( + name=skill["name"], + defaults={ + "bonus": skill["bonus"], + "race": race_obj + } + ) + guild = player["guild"] + if guild: + guild_obj, created = Guild.objects.get_or_create( + name=guild["name"], + defaults={ + "description": guild["description"] + } + ) + else: + guild_obj = None + Player.objects.get_or_create( + nickname=nickname, + defaults={ + "email": player["email"], + "bio": player["bio"], + "race": race_obj, + "guild": guild_obj}) if __name__ == "__main__": main() From 497f2c79285f15373c64b989e05d74347a19e52d Mon Sep 17 00:00:00 2001 From: Nik Date: Wed, 13 May 2026 23:46:46 +0300 Subject: [PATCH 2/4] solution --- main.py | 1 + 1 file changed, 1 insertion(+) diff --git a/main.py b/main.py index 01d3fe49f..dafc9a4eb 100644 --- a/main.py +++ b/main.py @@ -41,5 +41,6 @@ def main() -> None: "race": race_obj, "guild": guild_obj}) + if __name__ == "__main__": main() From 0e5a7fefdff2acbb96c9ab75b3f474c925516523 Mon Sep 17 00:00:00 2001 From: Nik Date: Wed, 13 May 2026 23:52:41 +0300 Subject: [PATCH 3/4] solution --- db/models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/db/models.py b/db/models.py index 8dc3208be..a34cf1584 100644 --- a/db/models.py +++ b/db/models.py @@ -12,7 +12,7 @@ class Skill(models.Model): race = models.ForeignKey( Race, on_delete=models.CASCADE, - related_name="skills" + related_name="races" ) @@ -28,7 +28,7 @@ class Player(models.Model): race = models.ForeignKey( Race, on_delete=models.CASCADE, - related_name="races" + related_name="players" ) guild = models.ForeignKey( Guild, From f4d90f5c577edac4795c353c6d8c14eae201cd51 Mon Sep 17 00:00:00 2001 From: Nik Date: Thu, 14 May 2026 00:06:55 +0300 Subject: [PATCH 4/4] solution --- db/migrations/0001_initial.py | 6 +++--- main.py | 26 ++++++++++++++------------ 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/db/migrations/0001_initial.py b/db/migrations/0001_initial.py index 94725ef5b..fbc26563c 100644 --- a/db/migrations/0001_initial.py +++ b/db/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 6.0.5 on 2026-05-13 15:34 +# Generated by Django 6.0.5 on 2026-05-13 16:01 import django.db.models.deletion from django.db import migrations, models @@ -37,7 +37,7 @@ class Migration(migrations.Migration): ('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, related_name='guilds', to='db.guild')), - ('race', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='races', to='db.race')), + ('race', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='players', to='db.race')), ], ), migrations.CreateModel( @@ -46,7 +46,7 @@ class Migration(migrations.Migration): ('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, related_name='skills', to='db.race')), + ('race', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='races', to='db.race')), ], ), ] diff --git a/main.py b/main.py index dafc9a4eb..85f9fe6cb 100644 --- a/main.py +++ b/main.py @@ -8,27 +8,27 @@ def main() -> None: players = json.load(file) for nickname, player in players.items(): - race = player["race"] + race = player.get("race") race_obj, created = Race.objects.get_or_create( - name=race["name"], + name=race.get("name"), defaults={ - "description": race["description"] + "description": race.get("description") } ) - for skill in race["skills"]: + for skill in race.get("skills"): Skill.objects.get_or_create( - name=skill["name"], + name=skill.get("name"), defaults={ - "bonus": skill["bonus"], + "bonus": skill.get("bonus"), "race": race_obj } ) - guild = player["guild"] + guild = player.get("guild") if guild: guild_obj, created = Guild.objects.get_or_create( - name=guild["name"], + name=guild.get("name"), defaults={ - "description": guild["description"] + "description": guild.get("description") } ) else: @@ -36,10 +36,12 @@ def main() -> None: Player.objects.get_or_create( nickname=nickname, defaults={ - "email": player["email"], - "bio": player["bio"], + "email": player.get("email"), + "bio": player.get("bio"), "race": race_obj, - "guild": guild_obj}) + "guild": guild_obj + } + ) if __name__ == "__main__":