【问题标题】:Find model object that encompasses another in Django在 Django 中查找包含另一个模型对象
【发布时间】:2016-06-29 10:28:38
【问题描述】:

给定一个未保存的/本地模型对象,我怎样才能找到已经拥有未保存对象信息的对象列表,而不必保持字段列表同步?

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

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

然后从“迷失在宇宙中的手”数据库中,我收到一个事件,告诉我“将卢克的 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)

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    这是一个没有意义的练习

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

    在我看来,这只是为了混淆代码,而只需在您希望引入此新方法的地方插入查询集即可轻松实现。

    抽象这个调用并没有取得什么成果,因为你仍然需要传递与没有该方法时相同的信息。


    对于它的价值,update_or_create 可能能够帮助提供给定的示例代码。

    【讨论】:

    • 是的,我明白这一点。 update_or_create 并不真正适合我的用例,因为我在“创建”路径上的逻辑比问题中的要复杂一些。
    【解决方案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()
    

    【讨论】:

    • 对不起,我已经稍微澄清了我的问题。尽管我的示例没有显示它,但我正在寻找一种解决方案,该解决方案可以找到具有尽可能多信息的匹配对象。
    • 你的意思是像发送多个过滤器?请清楚。 “包含尽可能多的信息”听起来很模糊
    • 是的,我已经包含了更多示例和一个可能的实现,该实现存在“保持字段列表同步”问题。
    猜你喜欢
    • 2015-12-27
    • 2013-08-27
    • 2018-06-12
    • 2018-10-28
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 2011-07-01
    相关资源
    最近更新 更多