gpt4 book ai didi

python - 如何从 Django 模型获取属性?

转载 作者:行者123 更新时间:2023-11-30 22:21:55 26 4
gpt4 key购买 nike

class Jornal(models.Model):
url = models.URLField(unique = True,blank=True)
name = models.CharField(max_length=100)

def __str__(self):
return self.name
@property
def domain(self):
return urlparse(self.url).netloc

如何通过其域获取 Jornal 对象?我在外壳中尝试这样做:

domain = "www.example.com"
obj = Jornal.objects.get_domain(domain)

然后是这个:

domain = "www.example.com"
obj = Jornal.objects(domain = domain)

但没有任何效果。

编辑 我尝试使用 get 方法,因为我想要DoesNotExist,以防找不到它。

最佳答案

由于该属性是在运行时存储的,因此,如果我们将该属性视为黑盒,我们只能通过在 Python 级别进行过滤来实现这一点。例如,使用列表理解:

domain = "www.example.com"
all_example_domain = [j for j in Journal.objects.all() if j.domain == domain]

一般情况下,我们不能反转函数,因此我们不能为此在数据库级别使用过滤。

这里我们现在有一些额外的东西:domain是 URL 的子字符串。因此,我们可以通过在数据库级别进行一些过滤来增强过滤过程:

domain = "www.example.com"
all_example_domain = [j for j in Journal.objects.filter(url__icontains=domain)
if j.domain == domain]

所以这里我们已经过滤掉了 Journal url 的对象是否包含所请求的domain 。从技术上讲,其中可能仍然存在错误(例如带有 www.example.com.com 的 url)。因此,我们最好使用 j.domain == domain 进行第二次过滤。 .

如果没有这样的对象,则列表将为空,如果有多个,则列表将包含两个或多个项目。

我们可以使用它来编写一个函数,该函数将进行适当的过滤,并在没有此类对象或找到多个对象的情况下引发错误。例如:

从 itertools 导入 islice

def property_get(query_set, **kwargs):
results = list(islice((j for j in qs
if all(getattr(j, k) == v for k, v in kwargs.items())),
2))
if results:
if len(results) > 1:
raise MultipleObjectsReturned
return results[0]
else:
raise ObjectDoesNotExist

我们可以使用 property_get(Journal.objects.all(), domain=domain) 进行查询它将引发 ObjectDoesNotExistMultiObjectsReturned异常(exception)情况。但效率相当低。

通常,如果您经常查询某个属性,最好将该属性存储在数据库和字段中,从而不使用属性。

关于python - 如何从 Django 模型获取属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48486465/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com