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 кортежа.

Вернуться на верх