Jak mogę dołączyć wewnętrzne do django?


Chcę pokazać w html nazwę miasta, stanu i kraju publikacji. Ale są w różnych tabelach.
Tutaj jest mój

models.py

class country(models.Model):
country_name = models.CharField(max_length=200, null=True)
country_subdomain = models.CharField(max_length=3, null=True)
def __str__(self):
return self.country_nameclass countrystate(models.Model):
state_name = models.CharField(max_length=200, null=True)
country = models.ForeignKey(country, on_delete=models.CASCADE, null=True)
importance = models.IntegerField(null=True)
def __str__(self):
return self.state_nameclass city(models.Model):
city_name = models.CharField(max_length=200, null=True)
countrystate = models.ForeignKey(countrystate, on_delete=models.CASCADE, null=True)
def __str__(self):
return self.city_nameclass publication(models.Model):
user = ForeignKey(users, on_delete=models.CASCADE, null=False)
title= models.CharField(max_length=300, null=True)
country=models.ForeignKey(country, on_delete=models.CASCADE, null=True)
countrystate=models.ForeignKey(countrystate, on_delete=models.CASCADE, null=True)
city=models.ForeignKey(city, on_delete=models.CASCADE, null=True) def __str__(self):
return self.title

Oto moje views.py
def publications(request):
mypublications = publication.objects.filter(user_id=request.session['account_id'])
dic.update({"plist": mypublications })
return render(request, 'blog/mypublications.html', dic)

W widoku django, jaki jest odpowiednik następującego zapytania sql?
SELECT p.user_id, p.title, c.cuntry_id, c.country_name, s.state_id, s.state_name, y.city_id, y.city_name FROM publication AS p
INNER JOIN country AS c ON c.id = p.country_id
INNER JOIN countrystate AS s ON s.id = p.countrystate_id
INNER JOIN city AS y ON y.id = p.city_id

Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Prawdopodobnie szukasz
select_related
https://docs.djangoproject.com ... lated
co jest naturalnym sposobem osiągnięcia tego celu:
pubs = publication.objects.select_related('country', 'country_state', 'city')

Możesz sprawdzić wynikowy kod SQL za pomocą
str (pubs.query)
, co powinno dać wynik w następujących wierszach (przykład wzięty z zaplecza postgres):
SELECT "publication"."id", "publication"."title", ..., "country"."country_name", ... 
FROM "publication"
INNER JOIN "country" ON ( "publication"."country_id" = "country"."id" )
INNER JOIN "countrystate" ON ( "publication"."countrystate_id" = "countrystate"."id" )
INNER JOIN "city" ON ( "publication"."city_id" = "city"."id" )

Zwracane wartości kursora są następnie mapowane do odpowiednich instancji ORM, dzięki czemu podczas przeglądania tych publikacji można uzyskać dostęp do wartości powiązanych tabel za pośrednictwem ich własnych obiektów. Jednak te wywołania wzdłuż wstępnie wybranych relacji bezpośrednich nie spowodują dodatkowych wywołań bazy danych:
{% for p in pubs %}
{{ p.city.city_name}} # p.city has been populated in the initial query
# ...
{% endfor %}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Zacznę od opisania znaczenia terminów i uporządkowania ich ...
InnerJoin implikuje „wspólną” sekcję między dwiema (lub więcej) tabelami. Każdy z nich jest wykonywany jeden po drugim, zgodnie z sugestią zapytania SQL.
przechodząc przez zapytanie SQL, patrzysz na publikację jako główną, wszystkie twoje zapytania są kluczami obcymi wewnątrz publikacji, co daje ci CAŁY zbiór danych.
jeśli dobrze rozumiem, to czego szukasz w odpowiedniku Django jest filtrem łańcuchowym (nie zapytaniem), ponieważ Q da ci wyniki z każdego Q osobno i połączy je, podczas gdy chcesz, aby wyniki z jednego zastosowano do drugiego .
(Nie wiem, co robi dic.update ({"plist": mypublications}), nie jest jasne ..
Rozwiązanie:
country = country.objects.all ()
# pobierz cały kraj w tabeli krajów.
country_state = countrystate.objects.all ()
# pobierz wszystkie obiekty countrystate < code> city = city.objects.all () # pobierz wszystkie obiekty miasta
rozwiązanie 1: w python3 musisz użyć __in, działa to dobrze w Python2. i będziesz mieć kraj, coś z kraju (nie Nikt), tabelę countrystate (nikt nie ma), tabelę City (nikt), więc jeśli nic i od któregokolwiek z nich, to zapewni.
Uwaga: „Brak” (python) = „Null” (Baza danych SQL)
Pobierz wszystkie publikacje, które zawierają którekolwiek z powyższych (przyniosą prawie wszystko, co chcesz.
publications_list = publication.objects.filter (country = country, countrystate = country_state, city = city)
# get if any one tych, w których „id” (na którym opiera się obiekt) pasuje, co czyni go samym złączeniem wewnętrznym.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

from django.db import modelsclass Course(models.Model):
name=models.CharField(max_length=10)
courseid=models.CharField(max_length=30,primary_key=True)
class Enrollment(models.Model):
course=models.ForeignKey(Course,on_delete=models.CASCADE)
enrollid=models.CharField(max_length=20)#Queryset:
k=Enrollment.objects.filter(course__courseid=1).values('id','course__courseid','course__name','enrollid')print(k.query)
SELECT "app1_enrollment"."id", "app1_enrollment"."course_id", "app1_course"."name", "app1_enrollment"."enrollid" FROM "app1_enrollment" INNER JOIN "app1_course" ON ("app1_enrollment"."course_id" = "app1_course"."courseid") WHERE "app1_enrollment"."course_id" = 1
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Nie potrzebujesz INNER JOIN ani
select_related
w tym prostym przypadku, ponieważ możesz przejść bezpośrednio w szablonie do
city
,
countrystate
i < code> country - na podstawie tego, czego właśnie doświadczyłem w moim projekcie.
Ponieważ Twój zestaw QuerySet jest określony w kontekście
dic ['plist']
, w szablonie możesz po prostu:
{% for itero in plist %}{{ itero.title }}
{{ itero.city.city_name }}
{{ itero.citystate.citystate_name }}
{{ itero.country.country_name }}{% endfor %}

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się