- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在 Django 中构建一个项目,需要将给定模型中的所有字段列为 html 选择标记的选项。我写了一个递归函数来读取模型并返回一个包含所有字段和子字段的列表。像这样:
def get_fields_true_hierarchy(model, list_fields = []):
fields_obj = model._meta.fields
for field_obj in fields_obj:
if field_obj.rel:
dict_fields = {field_obj.attname: []}
list_fields.append(dict_fields)
get_fields_true_hierarchy(field_obj.rel.to, dict_fields[field_obj.attname])
else:
list_fields.append(field_obj.attname)
return list_fields
它返回如下对象:
fiedls = [
'id',
'title',
'number',
'start_date',
'finish_date',
{'status_id':
['id',
'name']
},
'postal_code',
{'requestor_id':
['id',
{'user_id':
['id',
'password',
'last_login',
'is_superuser',
'username',
'first_name',
'last_name',
'email',
'is_staff',
'is_active', '
date_joined']
},
'name',
'phone',
'email',
'contact_name',
'contact_email']
},
{'reason_id':
['id',
'description']
},
'details',
{'group_id':
['id',
'description']
},
{'subgroup_id':
['id',
'description']
},
{'manager_id':
['id',
'password',
'last_login',
'is_superuser',
'username',
'first_name',
'last_name',
'email',
'is_staff',
'is_active',
'date_joined']
},
'datetime_subscription',
'allowed',
'data_def'
]
但是,我需要得到一个单层列表,如下所示:
fiedls = [
'id',
'title',
'number',
'start_date',
'finish_date',
'status_id',
'status_id.id',
'status_id.name',
'postal_code',
'requestor_id',
'requestor_id.id',
'requestor_id.user_id',
'requestor_id.user_id.id',
'requestor_id.user_id.password',
'requestor_id.user_id.last_login',
'requestor_id.user_id.is_superuser',
'requestor_id.user_id.username',
'requestor_id.user_id.first_name',
'requestor_id.user_id.last_name',
'requestor_id.user_id.email',
'requestor_id.user_id.is_staff',
'requestor_id.user_id.is_active',
'requestor_id.user_id.date_joined',
'requestor_id.name',
'requestor_id.phone',
'requestor_id.email',
'requestor_id.contact_name',
'requestor_id.contact_email',
'reason_id',
'reason_id.id',
'reason_id.description',
'details',
'group_id',
'group_id.id',
'group_id.description',
'subgroup_id',
'subgroup_id.id',
'subgroup_id.description',
'manager_id',
'manager_id.id',
'manager_id.password',
'manager_id.last_login',
'manager_id.is_superuser',
'manager_id.username',
'manager_id.first_name',
'manager_id.last_name',
'manager_id.email',
'manager_id.is_staff',
'manager_id.is_active',
'manager_id.date_joined',
'datetime_subscription',
'allowed',
'data_def'
]
我无法编写递归函数来返回这样的结果。您对如何执行此任务有任何想法吗?我被困在下面的这个功能上。但它的行为并不像预期的那样。
PS.: list_fields
参数将来自 get_fields_true_hierarchy()
函数。
def get_fields_fake_hierarchy(list_fields, fake_hierarchy = [], parent_str = "", reset=True):
for field in list_fields:
if reset:
parent_str = ""
if isinstance(field, dict):
for key, value in field.iteritems():
fake_hierarchy.append(key)
parent_str += "."+key
get_fields_fake_hierarchy(value, fake_hierarchy, parent_str, reset=False)
else:
fake_hierarchy.append("%s.%s"%(parent_str, field))
fake_hierarchy = [i[1:] if i[0]=='.' else i for i in fake_hierarchy]
return fake_hierarchy
最佳答案
改用递归生成器,并动态地为名称添加前缀:
def do_prefix(name, prefix):
if prefix:
return "%s.%s" % (prefix, name)
return name
def get_fields_flat(model):
return [name for name in iter_fields(model)]
def iter_fields(model, prefix=None):
fields = model._meta.fields
for field in fields:
name = do_prefix(field.attname, prefix)
yield name
if field.rel:
rel = field.rel.to
for f in iter_fields(rel, name):
yield f
关于python - Django:递归获取模型字段(外键及其字段)作为字符串进入 1 级列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29366375/
如何使用 SPListCollection.Add(String, String, String, String, Int32, String, SPListTemplate.QuickLaunchO
我刚刚开始使用 C++ 并且对 C# 有一些经验,所以我有一些一般的编程经验。然而,似乎我马上就被击落了。我试过在谷歌上寻找,以免浪费任何人的时间,但没有结果。 int main(int argc,
这个问题已经有答案了: In Java 8 how do I transform a Map to another Map using a lambda? (8 个回答) Convert a Map>
我正在使用 node + typescript 和集成的 swagger 进行 API 调用。我 Swagger 提出以下要求 http://localhost:3033/employees/sear
我是 C++ 容器模板的新手。我收集了一些记录。每条记录都有一个唯一的名称,以及一个字段/值对列表。将按名称访问记录。字段/值对的顺序很重要。因此我设计如下: typedef string
我需要这两种方法,但j2me没有,我找到了一个replaceall();但这是 replaceall(string,string,string); 第二个方法是SringBuffer但在j2me中它没
If string is an alias of String in the .net framework为什么会发生这种情况,我应该如何解释它: type JustAString = string
我有两个列表(或字符串):一个大,另一个小。 我想检查较大的(A)是否包含小的(B)。 我的期望如下: 案例 1. B 是 A 的子集 A = [1,2,3] B = [1,2] contains(A
我有一个似乎无法解决的小问题。 这里...我有一个像这样创建的输入... var input = $(''); 如果我这样做......一切都很好 $(this).append(input); 如果我
我有以下代码片段 string[] lines = objects.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.No
这可能真的很简单,但我已经坚持了一段时间了。 我正在尝试输出一个字符串,然后输出一个带有两位小数的 double ,后跟另一个字符串,这是我的代码。 System.out.printf("成本:%.2
以下是 Cloud Firestore 列表查询中的示例之一 citiesRef.where("state", ">=", "CA").where("state", "= 字符串,我们在Stack O
我正在尝试检查一个字符串是否包含在另一个字符串中。后面的代码非常简单。我怎样才能在 jquery 中做到这一点? function deleteRow(locName, locID) { if
这个问题在这里已经有了答案: How to implement big int in C++ (14 个答案) 关闭 9 年前。 我有 2 个字符串,都只包含数字。这些数字大于 uint64_t 的
我有一个带有自定义转换器的 Dozer 映射: com.xyz.Customer com.xyz.CustomerDAO customerName
这个问题在这里已经有了答案: How do I compare strings in Java? (23 个回答) 关闭 6 年前。 我想了解字符串池的工作原理以及一个字符串等于另一个字符串的规则是
我已阅读 this问题和其他一些问题。但它们与我的问题有些无关 对于 UILabel 如果你不指定 ? 或 ! 你会得到这样的错误: @IBOutlet property has non-option
这两种方法中哪一种在理论上更快,为什么? (指向字符串的指针必须是常量。) destination[count] 和 *destination++ 之间的确切区别是什么? destination[co
This question already has answers here: Closed 11 years ago. Possible Duplicates: Is String.Format a
我有一个Stream一个文件的,现在我想将相同的单词组合成 Map这很重要,这个词在 Stream 中出现的频率. 我知道我必须使用 collect(Collectors.groupingBy(..)
我是一名优秀的程序员,十分优秀!