programing

장고에서 이너 조인을 만드는 방법은?

coolbiz 2023. 9. 7. 22:07
반응형

장고에서 이너 조인을 만드는 방법은?

html로 출판물의 도시, 주, 국가의 이름을 보여주고 싶습니다.하지만 그들은 다른 테이블에 있습니다.

저의 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_name

class 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_name

class 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_name

class 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

저의 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)

django 뷰에서 다음 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

이를 달성하기 위한 자연스러운 방법인 를 찾고 있을 것입니다.

pubs = publication.objects.select_related('country', 'country_state', 'city')

다음을 통해 결과 SQL을 확인할 수 있습니다.str(pubs.query), 다음 선을 따라 출력이 발생합니다(예: 포스트그레스 백엔드에서 발생).

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" ) 

그런 다음 반환된 커서 값이 해당 ORM 모델 인스턴스로 변환되므로 이러한 문서를 루프오버할 때 해당 개체를 통해 관련 테이블의 값에 액세스할 수 있습니다.그러나 미리 선택한 전달 관계에 따라 액세스할 경우 추가 DB 히트가 발생하지 않습니다.

{% for p in pubs %}
     {{ p.city.city_name}}  # p.city has been populated in the initial query
     # ...
{% endfor %}

먼저 용어의 의미를 설명하고 순서를...

내부 조인은 두 개 이상의 표 사이의 "공통" 섹션을 의미합니다.SQL 쿼리에서 알 수 있듯이 각각의 작업이 차례로 수행됩니다.

SQL 쿼리를 통해 Publication을 메인으로 보고 있으며, 모든 쿼리는 Publication 내의 외부 키이며 전체 데이터 세트를 제공합니다.

제가 이해한 바와 같이 장고등식에서 찾으시는 것이 정확하다면 Q는 각 Q의 결과를 별도로 제공하여 결합하는 반면 적용된 결과는 다른 Q의 결과를 원하기 때문에 (Query가 아닌) 연쇄적인 필터입니다.

(dic.update({"plist": my publications })가 무엇을 하는지 알 수 없습니다. 명확하지 않습니다.해결책:country = country.objects.all()# 모든 국가를 국가 테이블에 올립니다.country_state = countrystate.objects.all()# 시골의 물건을 모두 손에 넣다city = city.objects.all()# 도시의 모든 물건을 손에 넣다

해결책 1: python3에서 __in을 사용해야 하며, 이것은 python2에서 정상적으로 작동합니다. 그리고 테이블 국가(없음), 테이블 국가(없음), 테이블 국가(없음), 테이블 도시(없음)의 모든 것으로 국가를 얻을 수 있으므로, 그들 중 하나라도 있다면 제공할 것입니다.참고: 'None'(없음) = 'Null'(SQL Database) 위의 내용을 담고 있는 모든 출판물을 가져옵니다(실제로는 무엇이든 가져다 줍니다).publications_list = publication.objects.filter(country = country, countrystate = country_state, city = city)# 'id'(객체를 기준으로)가 일치하는 사람이 있으면 그 자체로 내적 결합이 됩니다.

이 방법은 유용할 것입니다.

publication = publication.objects.select_related('yourfield', 'yourfield', 'yourfield')

도 필요 도 필요 .select_related경우, 할 수 있기 이한우접할수에기서에기수eryueo,할이한e,eecity,countrystate,그리고.country– 제가 방금 프로젝트에서 경험한 것을 바탕으로 말입니다.

QuerySet을 되므로,dic['plist'], 템플릿에서는 다음을 수행할 수 있습니다.

{% for itero in plist %}

{{ itero.title }}
{{ itero.city.city_name }}
{{ itero.citystate.citystate_name }}
{{ itero.country.country_name }}

{% endfor %}
from django.db import models

class 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

언급URL : https://stackoverflow.com/questions/48128714/how-to-make-an-inner-join-in-django

반응형