Как объединить все модели, которые ссылаются на модель, в одну таблицу в Django? - PullRequest
1 голос
/ 23 февраля 2012

У меня есть несколько моделей Django, которые ссылаются на модель с использованием внешних ключей следующим образом:

class LocationHistory(models.Model):
    region = models.ForeignKey(WorldGrid)
    ...

class UserSynthVals(models.Model):
    region = models.ForeignKey(WorldGrid)
    ...

class RegionalVictoryRate(models.Model):
    region = models.ForeignKey(WorldGrid)
    ...

Где WorldGrid просто:

class WorldGrid(models.Model):
    latitude = models.FloatField()
    longitude = models.FloatField()
    ...

Теперь я могу получить всемодели, которые ссылаются на WorldGrid (абстрактно для повторного использования) с:

models_that_reference = [i.model for i in get_model('appname',model_name)._meta.get_all_related_objects()]

И в этот момент я могу пройти через них, получая их model.objects.all (). values ​​(), но я не могу найти способобъединить эти отдельные списки объектов в один, который я мог бы затем вывести в таблицу.

Я бы предпочел сделать что-то еще в соответствии с ожидаемым использованием django (например, что делает select_related ()) и сохранить это резюме.1012 *

Буду признателен за любую помощь в решении этой проблемы, или новое направление, чтобы попробовать.

Ответы [ 3 ]

0 голосов
/ 23 февраля 2012

В прошлом я модифицировал и поиграл с функцией get_deleted_objects от администратора, в django.contrib.admin.util, чтобы сделать это, вернуть все связанные объекты и отобразить их или манипулировать ими в некоторой форме.Это может быть хорошим началом для достижения того, что вы хотите.

0 голосов
/ 24 февраля 2012

Я смог найти довольно хороший способ сделать это, и select_related был действительно ключевым.После того, как у меня есть список ссылочных моделей, я могу сделать:

fields_that_reference = [[m._meta.object_name.lower()+'__'+f.name for f in m._meta.fields if not isinstance(f,related.ForeignKey) ] for m in models_that_reference]

for i in fields_that_reference:
    fields +=i

Чтобы получить все поля, которые я пытаюсь увидеть сразу, а затем:

all_objects = get_model('appname',model_name).objects.select_related().values(*fields)

Чтобы собрать их всех в один гигантский список.Если ваши модели являются историческими (с полями даты и времени) или имеют круглые внешние ключи, вам, вероятно, придется подрезать этот результат еще немного, прежде чем отображать его, но это все прекрасно сочетает.

0 голосов
/ 23 февраля 2012

Я думаю, вы можете сделать это с помощью фильтров.Вы хотите присоединить WorldGrid к связанным моделям и отфильтровать, где нет объединения.

WorldGrid.objects.filter( regionalvictoryrate_region__isnull=False,
                      usersynthvals_region__isnull=False,
                      locationhistory_region__isnull=False )

См. Примечания здесьhttps://docs.djangoproject.com/en/dev/topics/db/queries/

...