Django Raw Query хочет получить ID, но все равно не работает
Я начинающий программист и у меня проблема с Django. Я написал сырой запрос, но он не работает. Кто-нибудь может мне помочь?
Вот мои модели:
class Kunde(models.Model):
kunden_id = models.IntegerField(db_column='Kunden_ID', primary_key=True)
vertragspartner = models.CharField(db_column='Vertragspartner', max_length=45, blank=True, null=True)
labor = models.CharField(db_column='Labor', max_length=45, blank=True, null=True)
def __str__(self):
return str(self.kunden_id)
class Meta:
managed = True
db_table = 'kunde'
class Objekte(models.Model):
objekt_id = models.CharField(db_column='Objekt_ID', primary_key=True, max_length=50)
rechnungsempfaenger = models.CharField(db_column='Rechnungsempfaenger', max_length=50, blank=True, null=True)
kundecenter = models.CharField(db_column='Kundecenter', max_length=50, blank=True, null=True)
twa_nr = models.IntegerField(db_column='TWA_Nr', blank=True, null=True)
karte = models.IntegerField(db_column='Karte', blank=True, null=True)
def __str__(self):
return self.objekt_id
class Meta:
managed = True
db_table = 'objekte'
ordering =['objekt_id']
Модель Objekte немного больше, но я обрезал ее, чтобы она была немного "красивее".
Мои представления выглядят следующим образом
def kunde_all (request):
sql = "SELECT **kunde.kunden_id as id**, kunde.Vertragspartner, kunde.Labor, objekte.Objekt_ID, COUNT(objekte.Objekt_ID) AS anzahl FROM kunde LEFT JOIN objekte ON kunde.kunden_id = objekte.kunden_id GROUP BY kunde.kunden_id"
sql_data= Kunde.objects.raw(sql)
p = Paginator(Kunde.objects.raw(sql_data), 20)
page = request.GET.get('page')
kunden=p.get_page(page)
context={
'kunden': kunden,
}
return render(request,"kunde.html", context=context)
Что я пытаюсь сделать, так это подсчитать объекты в Objekte, которые принадлежат Kunde, и вывести их в таблицу. Проблема в том, что я всегда получаю сообщение "Raw query must include the primary key" Я поискал и наиболее распространенным решением было добавить id в запрос. Я сделал это, но это все равно не работает для меня ...
Я пытался сделать это с помощью left join, но не знаю, как это сделать в Django, поэтому я использовал Raw Query, если вы можете помочь мне и с этим, я был бы очень признателен.
А также мой английский не так хорош, если вы не поняли мой вопрос или я что-то забыл, пожалуйста, дайте мне знать.
Я думаю, что вы объявили Kunden_ID
в качестве первичного ключа, но вы пытаетесь использовать kunden_id
в своем запросе.
Попробуйте использовать это в запросе, куда бы вы ни обращались Kunden_ID
:
SELECT
kunde."Kunden_ID" as id,
kunde."Vertragspartner",
kunde.Labor, objekte."Objekt_ID",
COUNT(objekte."Objekt_ID") AS anzahl
FROM kunde
LEFT JOIN objekte ON kunde.kunden_id = objekte."Kunden_ID"
GROUP BY kunde."Kunden_ID"
Вы должны объявить Objekte.kunden_id
как внешний ключ (по умолчанию, для поля FK kunden
, опорным полем является kunden_id
, так что это работает):
class Objekte(models.Model):
# ...
kunden = models.ForeignKey(Kunden, on_delete=models.PROTECT)
Тогда вам вообще не нужен необработанный SQL (хотя я исключил из него поле objekt_id
, поскольку его значение будет неопределенным благодаря группировке по):
qs = (
Kunde.objects.all()
.annotate(anzahl=Count("objekte_set"))
.values_list("kunden_id", "Vertragspartner", "Labor", "anzahl")
)
Итерация qs
даст 4 кортежа.