在Djang中查找包含另一个对象的模型对象

2024-05-23 17:38:06 发布

您现在位置:Python中文网/ 问答频道 /正文

给定一个未保存的/本地模型对象,如何在不必保持字段列表同步的情况下找到已经具有未保存对象信息的对象列表

例如,假设我有这个模型:

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()

后续问题:

  • 这是一个毫无意义的练习,我是否应该尽可能长时间地将来自外部的数据作为字典保存
  • 如果Person有一个我可能想要包含的相关字段呢?e、 g.side = models.ForeignKey(SideOfTheForce, null=True)

Tags: 对象nameobjectsobjectmodelsmycreatejob
2条回答

更改:

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()

Is this a pointless exercise

是的,但不是因为你说的关于字典的原因

在我看来,它只是为了它而混淆代码,而同样的代码可以通过插入一个queryset来轻松实现,您希望在其中引入这个新方法

通过抽象这个调用并没有取得多大的效果,因为仍然需要传递与不使用该方法时相同的信息


不管它值多少钱,^{}也许能够帮助您完成给定的示例代码

相关问题 更多 >