【问题标题】:What is Django ORM equivalent of SELECT col1 FROM table WHERE col2=somestring?什么是 SELECT col1 FROM table WHERE col2=somestring 的 Django ORM 等价物?
【发布时间】:2016-12-07 05:09:11
【问题描述】:

型号

class ShowDetail(models.Model):
    title = models.CharField(max_length=100)

class SeasonDetail(models.Model):
    title = models.ForeignKey(ShowDetail, on_delete=models.CASCADE)

class EpisodeDetail(models.Model):
    showTitle = models.ForeignKey(ShowDetail, on_delete=models.CASCADE)
    seasonNumber = models.ForeignKey(SeasonDetail, on_delete=models.CASCADE)
    episodeTitle = models.CharField(max_length=100, null=True, blank=True)
    episodeNumber = models.CharField(max_length=5, null=True, blank=True)

逻辑

episode_update.seasonNumber = SeasonDetail.objects.filter(title=showname).values('season')

我想检查给定电视节目(Arrow、The Flash 等)的季节值(01、02、03 等)。

当我尝试在 EpisodeDetail 模型中更新季节值时,出现以下错误:

invalid literal for int() with base 10: 'The Flash'

当我使用时

episode_update.seasonNumber = SeasonDetail.objects.filter(title=showname).values_list('season', flat=True)

遇到错误

invalid literal for int() with base 10: 'The Flash'

当我使用

episode_update.seasonNumber = SeasonDetail.objects.filter(title=ShowDetail.objects.get(title=showname)).values_list('season', flat=True)

我得到了

Cannot assign "['01']": "EpisodeDetail.seasonNumber" must be a "SeasonDetail" instance.

【问题讨论】:

    标签: mysql django django-models sqlite django-orm


    【解决方案1】:

    是的,您可以使用values() 查询集方法。

    YouModel.objects.filter(col2=something).values('col1')
    

    更新 1

    如果你想要一个原始的表示,你需要使用values_listflat=True

    YouModel.objects.filter(title=showname).values_list('season',flat=True)
    

    返回

    [01, 02, 03,....]
    

    更新 2 在您的模型中,seasonNumber 是 SeasonDetail 实例的外键,您正在尝试分配一个列表。所以,删除value_list() 并获取第一个。

    episode_update.seasonNumber = SeasonDetail.objects.filter(title=showname)[0]
    

    【讨论】:

    • 那不起作用,我已在问题中添加了详细信息。如果需要更多详细信息,请告知或让我知道。
    • @sid8491 更新了它。检查一下。
    • 仍然出现同样的错误:int() 的无效文字,基数为 10:'The Flash',如果我使用 episode_update.seasonNumber = SeasonDetail.objects.filter(title=ShowDetail.objects.get(title= showname)).values_list('season', flat=True) 然后出现以下错误:无法分配“['01']”:“EpisodeDetail.seasonNumber”必须是“SeasonDetail”实例。
    • 谢谢,它使用以下代码:episode_update.seasonNumber = SeasonDetail.objects.filter(season=str(i).zfill(2))[0]
    【解决方案2】:

    使用 django 版本 >=1.8:使用 values_list

    您可以访问列列表。

    YourModel.objects.values_list('col1', 'col2')
    

    你也可以使用:-

    QuerySet.only()QuerySet.defer() 可用于定义 ORM 查询应获取哪些字段并推迟其他字段,直到访问模型上的适当属性。

    【讨论】:

    • 那不起作用,我已在问题中添加了详细信息。如果需要更多详细信息,请告知或让我知道。
    • 我认为您正在将“闪光”传递给 seasonNumber,但它需要 IntegerNumber。 01 或 02。​​
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    相关资源
    最近更新 更多