Необработанные результаты запроса увеличиваются во много раз, когда я использую INNER JOIN в Django
Я не могу понять, почему мой необработанный запрос умножает результат во столько раз, сколько пользователей. Я использую INNER JOIN и связываю два объекта, так что я действительно не могу понять этого. (У меня нет опыта в языке запросов Django, поэтому я использую необработанный запрос).
views.py
def index(request):
projekt = Projekt.objects.raw('SELECT projekt_id, stressz_projekt.projekt, last_name, first_name, stressz_profile.id, stressz_profile.user_id, auth_user.id FROM stressz_profile INNER JOIN stressz_projekt ON stressz_projekt.id = stressz_profile.projekt_id INNER JOIN auth_user ON auth_user.id = stressz_profile.user_id')
template = loader.get_template('stressz/index.html')
context = {
'projekt': projekt,
}
return HttpResponse(template.render(context, request))
Вот простой пример использования ORM, который вы можете адаптировать к своему случаю:
Предположим, что у нас есть две модели, Country
и City
, следующим образом:
class Country(models.Model):
""" country model """
name = models.CharField(...)
class City(models.Model):
""" city model with a foreign key to a country """
country = models.ForeignKey('Country', ..., related_name='cities')
name = models.CharField(...)
population = models.PositiveIntegerField(...)
Мы можем использовать Django ORM следующим образом:
# filter for a country with a given name:
country = Country.objects.filter(name='Italy')
country.name # Italy
# filter for a city with a given name:
city = City.objects.filter(name='Rome')
city.name # Rome
# get the country the city belongs to:
country = city.country
country.name # Italy
# get the queryset of all cities with a population greater than 1 million in a specific country:
country = Country.objects.filter(name='Italy')
large_cities = country.cities.filter(population__gt=1000000)
for city in large_cities:
print(city.name)
# loop will print: Rome, Milan
Кроме того, похоже, что вы просто передаете экземпляр Projeckt
в ваш шаблон. Поэтому вам действительно не нужен ORM, вместо этого вы можете сделать что-то вроде:
Я также коротко добавлю, что, похоже, вы изменили соотношение профиль-проект на противоположное - профиль может иметь только один проект, но проект может иметь много профилей - не уверен, что это было задумано.
views.py
def index(request):
# get projekt by id:
projekt = Projekt.objects.get(id=<the-id>)
template = loader.get_template('stressz/index.html')
context = {
'projekt': projekt,
}
return HttpResponse(template.render(context, request))
А затем в вашем шаблоне: stressz/index.html
<!-- use context data in template -->
<div> Name: {{projekt.projekt}} </div>
<!-- loop over all profiles in the project -->
{% for profile in projekt.profile_set %}
<div> User First Name: {{ profile.user.first_name }} </div>
<div> User Last Name: {{ profile.user.last_name}} </div>
{% endfor %}