给定未保存的/本地模型对象,如何找到已经拥有未保存对象信息的对象列表,而不必保持字段列表同步?
例如,假设我有这个模型:
class Person(models.Model):
name = models.CharField(max_length=100)
job = models.CharField(max_length=100, null=True)
hands_lost = models.IntegerField(null=True)
并说我过去已经创建了一些数据:
Person.objects.create(name='Luke', job='Trainee')
Person.objects.create(name='Yoda', job='Master')
Person.objects.create(name='Yoda', job='Force Ghost')
然后从“在宇宙中失去的手”DB中我得到一个事件告诉我“将Luke的HANDS_LOST设置为1”,我想做类似的事情:
luke = find_my_object(Person(name='Luke'))
if luke:
luke.hands_lost = 1
luke.save()
else:
luke = Person.objects.create(name='Luke', hands_lost=1)[0]
其中:
def find_my_object(person):
return **MAGIC HERE**.first()
预期结果可能是:
find_my_object(Person(name='Luke')) -> Luke
find_my_object(Person(name='Yoda')) -> 1st Yoda
find_my_object(Person(name='Yoda', job='Force Ghost')) -> 2nd Yoda
“保持字段列表同步”问题的可能实现方法是:
def find_my_object(person):
query = {}
for field in ['name', 'job', 'hands_lost']:
value = getattr(person, field)
if value:
query[field] = value
return Person.objects.filter(**query).first()
跟进问题:
Person
有一个我可能想要包含的相关字段呢?例如side = models.ForeignKey(SideOfTheForce, null=True)
答案 0 :(得分:0)
变化:
luke = find_my_object(Person(name='Luke'))
到
luke = find_my_object('Person', name, 'Luke')
和
def find_my_object(modelname, fieldname, value=None):
return eval(modelname).objects.filter(fieldname='{}'.format(value)).first()
答案 1 :(得分:0)
这是一项毫无意义的练习
是的,但不是因为您已经说过字典
的原因在我看来,只要插入一个你想要引入这个新方法的查询集就可以轻松实现它的简单混淆代码。
您通过摘要此调用未取得多大成就,因为您仍需要传递与此方法相同的信息。
为了它的价值,update_or_create
可能能够帮助提供给出的示例代码。