개체를 가리키는 ForeignKey가있는 모든 모델 개체의 목록을 얻으려면 어떻게해야합니까? (DELETE CASCADE 전에 Django 관리자의 삭제 확인 페이지와 같은 것).
나는 데이터베이스에서 중복 객체를 병합하는 일반적인 방법을 생각해 내고 있습니다. 기본적으로 객체 “B”에 대한 ForeignKeys 포인트가있는 모든 객체가 “A”객체를 가리 키도록 업데이트되어 중요한 항목을 잃지 않고 “B”를 삭제할 수 있습니다.
당신의 도움을 주셔서 감사합니다!
답변
장고 <= 1.7
이렇게하면 모든 관련 개체의 속성 이름이 제공됩니다.
links = [rel.get_accessor_name() for rel in a._meta.get_all_related_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()
또한 소스의 반대 참조 )
답변
@digitalPBK가 가까웠습니다 … 여기에 Django 관리자에서 삭제하는 동안 관련 개체를 표시하는 데 사용되는 Django의 내장 항목을 사용하여 찾고있는 항목이 있습니다.
from django.contrib.admin.utils import NestedObjects
collector = NestedObjects(using="default") #database name
collector.collect([objective]) #list of objects. single one won't do
print(collector.data)
이를 통해 Django 관리자가 표시하는 항목 (삭제할 관련 개체)을 만들 수 있습니다.
답변
이것을 시도하십시오.
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]
답변
다음은 django가 모든 관련 객체를 가져 오는 데 사용하는 것입니다.
from django.db.models.deletion import Collector
collector = Collector(using="default")
collector.collect([a])
print collector.data
답변
links = [rel.get_accessor_name() for rel in a._meta.get_all_related_objects()]
그런 다음 다음과 같이 모든 관련 개체를 가져올 수 있습니다.
for link in links:
objects = getattr(a, link.name).all()
for object in objects:
# do something with related object instance
Django 1.10 공식 문서에서 :
MyModel._meta.get_all_related_objects ()는 다음과 같이됩니다.
[
f for f in MyModel._meta.get_fields()
if (f.one_to_many or f.one_to_one)
and f.auto_created and not f.concrete
]
따라서 승인 된 예를 사용하여 다음을 사용합니다.
links = [
f for f in MyModel._meta.get_fields()
if (f.one_to_many or f.one_to_one)
and f.auto_created and not f.concrete
]
for link in links:
objects = getattr(a, link.name).all()
for object in objects:
# do something with related object instance
답변
for link in links:
objects = getattr(a, link).all()
관련 세트에 대해 작동하지만 ForeignKey에는 작동하지 않습니다. RelatedManager는 동적으로 생성되므로 isinstance ()를 수행하는 것보다 클래스 이름을 보는 것이 더 쉽습니다.
objOrMgr = getattr(a, link)
if objOrMgr.__class__.__name__ == 'RelatedManager':
objects = objOrMgr.all()
else:
objects = [ objOrMgr ]
for object in objects:
# Do Stuff
답변
Django 1.9
get_all_related_objects ()는 더 이상 사용되지 않습니다.
#Example:
user = User.objects.get(id=1)
print(user._meta.get_fields())
참고 :
RemovedInDjango110Warning : ‘get_all_related_objects는 더 이상 사용되지 않는 비공식 API입니다. ‘get_fields ()’로 대체 할 수 있습니다.