Фильтрация по внешнему ключу в Django - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь отфильтровать таблицу по значению в другой таблице через внешний ключ.

trench_id = models.ForeignKey(Trench, db_column='trench_id', on_delete = models.PROTECT)

Как и выше, модель контекста присоединяется к модели Trench через trench_id__trench_id. Я хочу получить доступ к trench.name, как вы можете видеть ниже. Затем я использую это значение в фильтре. , Я включил код views.py и для справки мой models.py.

def allcontexts(request):
    allcontexts = Context.objects.filter(trench_id__trench_id__name=request.session.get("name"))
    return render(request, 'context_manager/context_manager.html',
    {
    'allcontexts':allcontexts,
    })

Я получаю следующую ошибку Unsupported lookup 'name' for AutoField or join on the field not permitted.

models.py

class Trench(models.Model):
    trench_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=50)
    area_easting = models.IntegerField()
    area_northing = models.IntegerField()

    def __str__(self):
        return str(self.name)

class Context(models.Model):
    context_id = models.AutoField(primary_key=True)
    trench_id = models.ForeignKey(Trench, db_column='trench_id', on_delete = models.PROTECT)
    number = models.IntegerField()
    type = models.CharField(max_length = 50, blank=True, null=True)
    description = models.TextField(blank=True, null=True)
    excavation_method = models.CharField(max_length = 50, blank=True, null=True)
    open_date = models.DateField(blank=True, null=True)
    close_date = models.DateField(blank=True, null=True)
    excavated_by = models.CharField(max_length = 50, blank=True, null=True)
    area_easting = models.IntegerField()

    def __str__(self):
        return str(self.number)

Дополнительное устранение неполадок

Вот генерируемый sql, который не отображается в таблице траншей.

queryset = Context.objects.filter(trench_id__trench_id=4)

print(queryset.query)

SELECT "kap"."context"."context_id", "kap"."context"."trench_id", "kap"."context"."number", "kap"."context"."type", "kap"."context"."description", "kap"."context"."excavation_method", "kap"."context"."open_date", "kap"."context"."close_date", "kap"."context"."excavated_by", "kap"."context"."area_easting" 
FROM "kap"."context" 
WHERE "kap"."context"."trench_id" = 4 ORDER BY "kap"."context"."number" ASC

1 Ответ

1 голос
/ 14 января 2020

Похоже, это должно быть просто Context.objects.filter(trench_id__name=request.session.get("name")). Как написано, вы запрашиваете атрибут name для trench_id AutoField на модели Trench - которого, конечно, не существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...