Как получить данные из таблиц в Django, которые не связаны напрямую? - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть таблица ответов:

class Response(models.Model):
    Question = models.ForeignKey(Question, on_delete=models.CASCADE)
    Topic = models.ForeignKey(Topic, default=13, on_delete=models.CASCADE)
    Response = models.TextField()
    Client = models.ForeignKey(ClientDetail, default=8, on_delete=models.CASCADE)
    Planit_location = models.ForeignKey(Planit_location, default=1, on_delete=models.CASCADE)
    Date_added = models.DateField(default=datetime.date.today)
    Document = models.ForeignKey(Document, default=0, on_delete=models.CASCADE)

    def __str__(self):
        return self.Response

Я могу получить данные из других таблиц, к которым они непосредственно присоединены, например, Вопросы, Тема, Клиент:

views.py

clientList = ClientDetail.objects.all().order_by('Client_name')
topicList = Topic.objects.all().order_by('Topic_name')

Теперь я хочу получить «Имя сектора» из моей таблицы секторов:

class Sector(models.Model):
    Sector_name = models.CharField(max_length=255, default='Sector_name')

    def __str__(self):
        return self.Sector_name

, которая присоединена к моей таблице клиентов:

class ClientDetail(models.Model):
    Sector = models.ForeignKey(Sector, default=8, on_delete=models.CASCADE)
    Client_name = models.CharField(max_length=255, default='Client_name')

    class Meta:
        ordering = ['Client_name']

    def __str__(self):
        return self.Client_name

Я не могуиспользуйте тот же метод, который я использовал с клиентом, так как он не может найти поле "Sector_id" в таблице ответов:

sectorList = Sector.objects.all().order_by('Sector_name')
**THIS DOES NOT WORK**

На данный момент я могу получить только "Sector_id" из моей таблицы клиента, ночто я хочу, это "Имя сектора"

Что-то, что я должен добавить в мой файл documents.py?Поскольку я не могу использовать тот же метод, который я использовал для предыдущих моделей:

class ResponseDocument20(DocType):
    Client = fields.NestedField(properties={
        'Client_name': fields.TextField(),
        'pk': fields.IntegerField(),
    }, include_in_root=True)
    class Meta:
        model = Response

        fields = [
            'Response',
        ]
        related_models = [ClientDetail]

    def get_instances_from_related(self, related_instance):
        if isinstance(related_instance, ClientDetail):
            return related_instance.response_set.all()

1 Ответ

0 голосов
/ 29 ноября 2018

Используйте двойное подчеркивание для доступа к указанным полям модели, аннотируйте для создания читаемого псевдонима:

clientList = ClientDetail.objects.all() \
.annotate(Sector_name=F('Sector__Sector_name')) \
.order_by('Client_name')

Теперь ваш набор запросов имеет поле Sector_name со значениями Sector__Sector_name (FK->Sector->Sector_name).

F() документы - https://docs.djangoproject.com/en/2.1/ref/models/expressions/#f-expressions

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