Python 在Django中查找包含另一个对象的模型对象
给定一个未保存/本地模型对象,如何在不同步字段列表的情况下找到已包含未保存对象信息的对象列表 例如,假设我有这个模型:Python 在Django中查找包含另一个对象的模型对象,python,django,django-models,Python,Django,Django Models,给定一个未保存/本地模型对象,如何在不同步字段列表的情况下找到已包含未保存对象信息的对象列表 例如,假设我有这个模型: class Person(models.Model): name = models.CharField(max_length=100) job = models.CharField(max_length=100, null=True) hands_lost = models.IntegerField(null=True) 假设我过去已经创建了一些数据,
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')
然后从“宇宙中失去的手”数据库中,我得到一个事件,告诉我“把卢克的手设为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()
后续问题:
- 这是一个毫无意义的练习吗?我是否应该尽可能长时间地将来自外部的数据作为字典保存
- 如果
有一个我可能想要包含的相关字段,该怎么办?e、 g.Person
side=models.ForeignKey(力的sideofforce,null=True)
luke = find_my_object(Person(name='Luke'))
到
及
这是一个毫无意义的练习吗
是的,但不是因为你所说的关于词典的原因
在我看来,这只是为了它而混淆代码,而在您希望引入这种新方法的地方插入一个queryset就可以很容易地实现这一点
由于仍然需要传递与不使用该方法时相同的信息,因此抽象此调用并没有取得多大效果
不管它值多少钱,我们都可以帮助您完成给出的示例代码。对不起,我已经稍微澄清了我的问题。虽然我的示例并没有显示它,但我正在寻找一种解决方案,该解决方案可以找到具有尽可能多的信息的匹配对象?请讲清楚。“有尽可能多的信息”听起来很模糊。是的,我已经包括了更多的例子和一个可能的实现,它会受到“保持字段列表同步”问题的影响。是的,我明白这一点<代码>更新或创建并不真正适合我的用例,因为我在“创建”路径上的逻辑比问题中的要复杂一些。
luke = find_my_object('Person', name, 'Luke')
def find_my_object(modelname, fieldname, value=None):
return eval(modelname).objects.filter(fieldname='{}'.format(value)).first()