Advertisement
Guest User

Django N duplicated queries

a guest
Nov 23rd, 2021
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.08 KB | None | 0 0
  1. #models.py
  2.  
  3. from django.db import models
  4. from mptt.fields import TreeForeignKey
  5. from mptt.models import MPTTModel
  6.  
  7.  
  8. class Genre(MPTTModel):
  9.     name = models.CharField(max_length=50, unique=True)
  10.     parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children')
  11.  
  12.     def __str__(self):
  13.         return self.name
  14.  
  15.  
  16. class Game(models.Model):
  17.     name = models.CharField(max_length=50)
  18.     genre = models.ManyToManyField(Genre, blank=True, related_name='games')
  19.  
  20.     def __str__(self):
  21.         return self.name
  22.  
  23. # settings.py
  24. INSTALLED_APPS = [
  25.     ...
  26.     'debug_toolbar',
  27.     'mptt',
  28.     'rest_framework',
  29.     'rest_framework_recursive',
  30.     'games',
  31. ]
  32.  
  33. # views.py
  34. from django.shortcuts import render
  35. from rest_framework import serializers
  36. from rest_framework.response import Response
  37. from rest_framework.views import APIView
  38. from rest_framework_recursive.fields import RecursiveField
  39.  
  40. from games.models import Game, Genre
  41.  
  42.  
  43. class GameSerializer(serializers.ModelSerializer):
  44.  
  45.     class Meta:
  46.         model = Game
  47.         exclude = ['genre', ]
  48.  
  49.  
  50. class GenreGameSerializer(serializers.ModelSerializer):
  51.     children = RecursiveField(many=True)
  52.     games = GameSerializer(many=True,)
  53.  
  54.     class Meta:
  55.         model = Genre
  56.         fields = ['id', 'name', 'children', 'games']
  57.  
  58.  
  59. class GamesByGenreAPI(APIView):
  60.     queryset = Genre.objects.root_nodes()
  61.     serializer_class = GenreGameSerializer
  62.  
  63.     def get(self, request, *args, **kwargs):
  64.         ser = GenreGameSerializer(data=Genre.objects.root_nodes()
  65.                                       .prefetch_related('children__children', 'games'), many=True)
  66.         if ser.is_valid():
  67.             pass
  68.         return Response(ser.data)
  69.  
  70. # populator.py
  71.  
  72. import standalone
  73. standalone.run('myproject.settings')
  74.  
  75. from games.models import Game, Genre
  76.  
  77. gen_action, _ = Genre.objects.get_or_create(name="Action")
  78. gen2, _ = Genre.objects.get_or_create(name="Shooter", parent=gen_action)
  79. gen3, _ = Genre.objects.get_or_create(name="Stealth", parent=gen_action)
  80. gen_simulation, _ = Genre.objects.get_or_create(name="Simulation")
  81. gen5, _ = Genre.objects.get_or_create(name="Vehicle Simulation", parent=gen_simulation)
  82. gen6, _ = Genre.objects.get_or_create(name="Construction Simulation", parent=gen_simulation)
  83. gen_sports, _ = Genre.objects.get_or_create(name="Sports")
  84. gen8, _ = Genre.objects.get_or_create(name="Racing", parent=gen_sports)
  85. gen9, _ = Genre.objects.get_or_create(name="Sports Games", parent=gen_sports)
  86.  
  87.  
  88. x, _ = Game.objects.get_or_create(name="Battlefield")
  89. x.genre.add(gen2)
  90. x, _ = Game.objects.get_or_create(name="Destiny 2")
  91. x.genre.add(gen2)
  92. x, _ = Game.objects.get_or_create(name="Apex Legends")
  93. x.genre.add(gen2)
  94.  
  95.  
  96. x, _ = Game.objects.get_or_create(name="Invisible")
  97. x.genre.add(gen3)
  98. x, _ = Game.objects.get_or_create(name="Hitman")
  99. x.genre.add(gen3)
  100. x, _ = Game.objects.get_or_create(name="Dishonored 2")
  101. x.genre.add(gen3)
  102.  
  103.  
  104. x, _ = Game.objects.get_or_create(name="MS Flight Simulator")
  105. x.genre.add(gen5)
  106. x, _ = Game.objects.get_or_create(name="Euro Truck Simulator 2")
  107. x.genre.add(gen5)
  108. x, _ = Game.objects.get_or_create(name="Bus Simulator 21")
  109. x.genre.add(gen5)
  110.  
  111.  
  112. x, _ = Game.objects.get_or_create(name="SimCity")
  113. x.genre.add(gen6)
  114. x, _ = Game.objects.get_or_create(name="Theo Town")
  115. x.genre.add(gen6)
  116. x, _ = Game.objects.get_or_create(name="Design Home")
  117. x.genre.add(gen6)
  118.  
  119.  
  120. x, _ = Game.objects.get_or_create(name="Forza Horizon 5")
  121. x.genre.add(gen8)
  122. x, _ = Game.objects.get_or_create(name="Asphalt 9")
  123. x.genre.add(gen8)
  124. x, _ = Game.objects.get_or_create(name="Dirt 5")
  125. x.genre.add(gen8)
  126.  
  127. x, _ = Game.objects.get_or_create(name="FIFA 21")
  128. x.genre.add(gen9)
  129. x, _ = Game.objects.get_or_create(name="NBA 2K22")
  130. x.genre.add(gen9)
  131. x, _ = Game.objects.get_or_create(name="Madden NFL 21")
  132. x.genre.add(gen9)
  133.  
  134.  
  135. # pip freeze
  136. asgiref==3.4.1
  137. backports.zoneinfo==0.2.1
  138. Django==4.0b1
  139. django-js-asset==1.2.2
  140. django-mptt==0.13.4
  141. djangorestframework==3.12.4
  142. djangorestframework-recursive==0.1.2
  143. pytz==2021.3
  144. sqlparse==0.4.2
  145. standalone==1.0.1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement