관련된 모든 Django 모델 개체 가져 오기
개체를 가리키는 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의 내장 기능을 사용하여 찾고있는 것입니다.
from django.db.models.deletion import Collector
from django.contrib.admin.util 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]
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가 모든 관련 객체를 가져 오는 데 사용하는 것입니다.
from django.db.models.deletion import Collector
collector = Collector(using="default")
collector.collect([a])
print collector.data
Django 1.9
get_all_related_objects() has been deprecated
#Example:
user = User.objects.get(id=1)
print(user._meta.get_fields())
Note: RemovedInDjango110Warning: 'get_all_related_objects is an unofficial API that has been deprecated. You may be able to replace it with 'get_fields()'
Here is another way to get a list of fields (names only) in related models.
def get_related_model_fields(model):
fields=[]
related_models = model._meta.get_all_related_objects()
for r in related_models:
fields.extend(r.opts.get_all_field_names())
return fields
Unfortunately, user._meta.get_fields() returns only relations accessible from user, however, you may have some related object, which uses related_name='+'. In such case, the relation would not be returned by user._meta.get_fields(). Therefore, if You need generic and robust way to merge objects, I'd suggest to use the Collector mentioned above.
참고URL : https://stackoverflow.com/questions/2233883/get-all-related-django-model-objects
'code' 카테고리의 다른 글
foreach 루프 내부 또는 외부에서 변수 선언 : 어느 것이 더 빠르거나 더 낫습니까? (0) | 2020.09.25 |
---|---|
할당 된 값이 아닌 단위로 평가하는 Scala 할당의 동기는 무엇입니까? (0) | 2020.09.25 |
jQuery UI 자동 완성에서 HTML 사용 (0) | 2020.09.25 |
큰 테이블에서 SQL Server 쿼리 성능 향상 (0) | 2020.09.25 |
추적 된 원격 분기의 변경 사항으로 로컬 분기 업데이트 (0) | 2020.09.25 |