Получите все связанные объекты модели Django

Как я могу получить список всех объектов модели, которые имеют ForeignKey, указывающий на объект? (Что-то как удалить страница подтверждения в администраторе Django прежде УДАЛЯЕТ КАСКАД).

Я пытаюсь придумать универсальный способ объединить дублирующиеся объекты в базе данных. В основном я хочу все объекты, которые имеют точки ForeignKeys для возражения "B", который будет обновлен для указания для возражения "A", таким образом, я могу тогда удалить "B", не теряя ничего важного.

Спасибо за помощь!

83
задан erikcw 10 February 2010 в 01:46
поделиться

2 ответа

Django <= 1.7

Это дает вам имена свойств для всех связанных объектов:

links = [rel.get_accessor_name() for rel in a._meta.get_all_related_objects()]

Затем вы можете использовать что-то вроде этого, чтобы получить все связанные objects:

for link in links:
    objects = getattr(a, link).all()
    for object in objects:
        # do something with related object instance

Я потратил некоторое время, пытаясь понять это, чтобы реализовать своего рода «паттерн наблюдателя» на одной из моих моделей. Надеюсь, это поможет.

Django 1.8+

Используйте _meta.get_fields () : https://docs.djangoproject.com/en/1.10/ref/models/meta/#django.db. models.options.Options.get_fields (также см. реверс в источнике _get_fields () )

81
ответ дан 24 November 2019 в 08:54
поделиться

Я бы не использовал noscript для отображения альтернативного содержимого. Для одного из них в теге < noscript > допустимо только ограниченное число тегов, и < style > не является одним из них. Вместо этого используйте другой подход. Отображать содержимое, если javascript отключен по умолчанию, и показывать альтернативное содержимое, если JavaScript включен . Лучший способ сделать это с простым CSS и одной линейкой JS. Если вы делаете это так, как я показываю здесь, не должно быть неловкой вспышки контента:

  <head>
     ...
     <script type="text/javascript"> document.documentElement.className += " js"</script>
     <link type="text/css" href="css/style.css" media="all" rel="stylesheet" />
  </head>
  <body>
     <div id="header" class="no_js">header</div>
     <div id="alt_header" class="js">header</div>

     .. etc ..
     <div id="super_duper" class="js">Whatever</div>
  </body>

Просто примените js ко всему, что должно показывать при включении JavaScript, и no _ js ко всему остальному. Затем в CSS поместите следующее:

html.js .no_js, html .js { display: none }
html.js .js { display: block }
-121--2762233-

Да, они могут. У меня есть 6,1 и 7,0 на одной машине (Windows 7 64 bit no VS 2005 хотя) без каких-либо заметных проблем.

-121--4460177-

Попробуйте.

class A(models.Model):
    def get_foreign_fields(self):
      return [getattr(self, f.name) for f in self._meta.fields if type(f) == models.fields.related.ForeignKey]
7
ответ дан 24 November 2019 в 08:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: