Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #models.py
- from django.db import models
- from mptt.fields import TreeForeignKey
- from mptt.models import MPTTModel
- class Genre(MPTTModel):
- name = models.CharField(max_length=50, unique=True)
- parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children')
- def __str__(self):
- return self.name
- class Game(models.Model):
- name = models.CharField(max_length=50)
- genre = models.ManyToManyField(Genre, blank=True, related_name='games')
- def __str__(self):
- return self.name
- # settings.py
- INSTALLED_APPS = [
- ...
- 'debug_toolbar',
- 'mptt',
- 'rest_framework',
- 'rest_framework_recursive',
- 'games',
- ]
- # views.py
- from django.shortcuts import render
- from rest_framework import serializers
- from rest_framework.response import Response
- from rest_framework.views import APIView
- from rest_framework_recursive.fields import RecursiveField
- from games.models import Game, Genre
- class GameSerializer(serializers.ModelSerializer):
- class Meta:
- model = Game
- exclude = ['genre', ]
- class GenreGameSerializer(serializers.ModelSerializer):
- children = RecursiveField(many=True)
- games = GameSerializer(many=True,)
- class Meta:
- model = Genre
- fields = ['id', 'name', 'children', 'games']
- class GamesByGenreAPI(APIView):
- queryset = Genre.objects.root_nodes()
- serializer_class = GenreGameSerializer
- def get(self, request, *args, **kwargs):
- ser = GenreGameSerializer(data=Genre.objects.root_nodes()
- .prefetch_related('children__children', 'games'), many=True)
- if ser.is_valid():
- pass
- return Response(ser.data)
- # populator.py
- import standalone
- standalone.run('myproject.settings')
- from games.models import Game, Genre
- gen_action, _ = Genre.objects.get_or_create(name="Action")
- gen2, _ = Genre.objects.get_or_create(name="Shooter", parent=gen_action)
- gen3, _ = Genre.objects.get_or_create(name="Stealth", parent=gen_action)
- gen_simulation, _ = Genre.objects.get_or_create(name="Simulation")
- gen5, _ = Genre.objects.get_or_create(name="Vehicle Simulation", parent=gen_simulation)
- gen6, _ = Genre.objects.get_or_create(name="Construction Simulation", parent=gen_simulation)
- gen_sports, _ = Genre.objects.get_or_create(name="Sports")
- gen8, _ = Genre.objects.get_or_create(name="Racing", parent=gen_sports)
- gen9, _ = Genre.objects.get_or_create(name="Sports Games", parent=gen_sports)
- x, _ = Game.objects.get_or_create(name="Battlefield")
- x.genre.add(gen2)
- x, _ = Game.objects.get_or_create(name="Destiny 2")
- x.genre.add(gen2)
- x, _ = Game.objects.get_or_create(name="Apex Legends")
- x.genre.add(gen2)
- x, _ = Game.objects.get_or_create(name="Invisible")
- x.genre.add(gen3)
- x, _ = Game.objects.get_or_create(name="Hitman")
- x.genre.add(gen3)
- x, _ = Game.objects.get_or_create(name="Dishonored 2")
- x.genre.add(gen3)
- x, _ = Game.objects.get_or_create(name="MS Flight Simulator")
- x.genre.add(gen5)
- x, _ = Game.objects.get_or_create(name="Euro Truck Simulator 2")
- x.genre.add(gen5)
- x, _ = Game.objects.get_or_create(name="Bus Simulator 21")
- x.genre.add(gen5)
- x, _ = Game.objects.get_or_create(name="SimCity")
- x.genre.add(gen6)
- x, _ = Game.objects.get_or_create(name="Theo Town")
- x.genre.add(gen6)
- x, _ = Game.objects.get_or_create(name="Design Home")
- x.genre.add(gen6)
- x, _ = Game.objects.get_or_create(name="Forza Horizon 5")
- x.genre.add(gen8)
- x, _ = Game.objects.get_or_create(name="Asphalt 9")
- x.genre.add(gen8)
- x, _ = Game.objects.get_or_create(name="Dirt 5")
- x.genre.add(gen8)
- x, _ = Game.objects.get_or_create(name="FIFA 21")
- x.genre.add(gen9)
- x, _ = Game.objects.get_or_create(name="NBA 2K22")
- x.genre.add(gen9)
- x, _ = Game.objects.get_or_create(name="Madden NFL 21")
- x.genre.add(gen9)
- # pip freeze
- asgiref==3.4.1
- backports.zoneinfo==0.2.1
- Django==4.0b1
- django-js-asset==1.2.2
- django-mptt==0.13.4
- djangorestframework==3.12.4
- djangorestframework-recursive==0.1.2
- pytz==2021.3
- sqlparse==0.4.2
- standalone==1.0.1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement