<p>其他答案肯定帮了我解决这个问题,特别是在我的例子中,我所有的关系都是M2M,并且有一个through表,而且所有的事情都是用AJAX/Javascript完成的,所以我的答案非常JSON-y</p>
<p>目前,它只获得m2m模型的所有表,因为您必须在其中创建对象才能创建关系,但它可以很容易地扩展到获取所有其他关系</p>
<pre><code>def get_relationships(model):
fields = list(model._meta.get_fields())
m2m_fields = {}
#Getting m2m relationships first
for i, field in enumerate(fields):
print(field)
if field.is_relation:
if field.many_to_many:
fields.pop(i)
try:
#If its a forward field, we want the relationship instead
if not hasattr(field,'field'):
field = field.remote_field
except AttributeError:
pass
if hasattr(field,'through'):
through = field.through
#In case of recursive relationships, there will be duplicates so we don't need to do it again
if m2m_fields.get(through._meta.model.__name__):
continue
m2m_fields[through._meta.model.__name__] = {}
m2m = m2m_fields[through._meta.model.__name__]
#Finding the models which participate in the through table and the direction
m2m['owner'] = {'model' : field.model.__name__}
m2m['related'] = {'model' : field.related_model.__name__}
recursive = False
#Checking recursivity, will use this later
#Finding field names for the foreignkeys of the through table
for through_field in through._meta.get_fields():
if not (through_field.related_model is None):
if m2m['owner']['model'] == through_field.related_model.__name__ and not m2m['owner'].get('field'):
m2m['owner']['field'] = through_field.name
elif m2m['related']['model'] == through_field.related_model.__name__ and not m2m['related'].get('field'):
m2m['related']['field'] = through_field.name
elif not through_field.primary_key:
if not m2m.get('rel_fields'):
m2m['rel_fields'] = []
m2m['rel_fields'].append(through_field.name)
#Now removing the through tables from the fields list, because they appear as a regular ManyToOne relationship otherwise
for through_table in m2m_fields.keys():
name = through_table
for i, field in enumerate(fields):
if field.many_to_one:
if field.__name__ and field.related_model:
if field.related_model.__name__ == name:
fields.pop(i)
#Todo : OneToOne and ManyToOne relationships
return m2m_fields
for key,value in get_relationships(Pessoa).items():
print(key, " = ", value)
</code></pre>
<p>这是一个非常难看的代码,但我不太擅长Python,只是想学习一些东西,但我保证它对我的问题很有帮助</p>