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

时间:2016-06-29 10:28:39

标签: 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)

并说我过去已经创建了一些数据:

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)

2 个答案:

答案 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可能能够帮助提供给出的示例代码。