【发布时间】:2022-11-16 03:15:26
【问题描述】:
我想知道哪些模型是具有 on_delete 属性的模型的子项。据我所知,如果我们有 ownerModel,它是 childModel1 和 check1Model 的父级,如下所示:
import uuid
from django.db import models
class ownerModel(models.Model):
ownerId = models.UUIDField(default=uuid.uuid4, unique=True, primary_key=True, editable=False, blank=True)
class check1Model(models.Model):
checkId = models.UUIDField(default=uuid.uuid4, unique=True, primary_key=True, editable=False, blank=True)
owner=models.ForeignKey(ownerModel,on_delete=models.CASCADE)
class childModel1(models.Model):
childId = models.UUIDField(default=uuid.uuid4, unique=True, primary_key=True, editable=False, blank=True)
check2=models.ForeignKey(ownerModel,on_delete=models.CASCADE)
然后我们可以用这样的代码得到哪些模型是ownerModel的孩子:
class myView(views.APIView):
def get(self, request, format=None):
for f in ownerModel._meta.get_fields():
if 'field' in f.__dict__.keys():
print('***childModels***')
print(f.__dict__)
print()
return Response({'0000'}, status=status.HTTP_200_OK)
我的意思是检查 field 键是否在 __dict__.keys() 的项目中 ownerModel._meta.get_fields()
ofc 所以像这里我们得到关于儿童模型的扩展信息:
***childModels***
{'field': <django.db.models.fields.related.ForeignKey: owner>, 'model': <class 'Users.models.ownerModel'>, 'related_name': None, 'related_query_name': None, 'limit_choices_to': {}, 'parent_link': False, 'on_delete': <function
CASCADE at 0x00000286550848B0>, 'symmetrical': False, 'multiple': True, 'field_name': 'ownerId', 'related_model': <class 'Users.models.check1Model'>, 'hidden': False}
***childModels***
{'field': <django.db.models.fields.related.ForeignKey: check2>, 'model': <class 'Users.models.ownerModel'>, 'related_name': None, 'related_query_name': None, 'limit_choices_to': {}, 'parent_link': False, 'on_delete': <function CASCADE at 0x00000286550848B0>, 'symmetrical': False, 'multiple': True, 'field_name': 'ownerId', 'related_model': <class 'Users.models.childModel1'>, 'hidden': False}
所以我发现这两个条件是获取子模型信息所必需的:
- 在子模型中确保子关系设置为如下一行:
models.ForeignKey(ownerModel,on_delete=models.CASCADE)- 如“如果
field密钥在ownerModel._meta.get_fields()的项目中的__dict__.keys()中”,获取儿童信息。
但问题是在某些情况下我无法从父模型中获取子信息。所以:
-
这让我想知道这两个条件是否足以找出哪些模型是模型的子模型?
-
还有其他类似的方法来获取哪些模型是模型的子代吗?
顺便说一句,我也想拥有
on_delete并且拥有on_delete是我使用_meta.get_fields()而不是_meta.fields的唯一原因,因为_meta.fields不提供on_delete属性。这是my code如果你想看一看。请注意,在完整的回答中,我也想知道是什么造成了问题,所以在这种情况下,
__dict__.keys()不提供其密钥中没有field的项目(不提供子模型详细信息)。因为通常这两个条件会提供子模型的详细信息。所以稍后我可以获得所有代码中的子模型详细信息。
- 如“如果
【问题讨论】:
-
“使用
on_delete属性”是什么意思?所有且只有ForeignKey和OneToOneField字段将具有on_delete属性。你想找到所有依赖于这个模型的模型吗?只有外键和一对一还是多对多?
标签: django