SELECT col1 FROM table WHERE col2=somestring 的 Django ORM 是什么?

What is Django ORM equivalent of SELECT col1 FROM table WHERE col2=somestring?

型号

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

我想检查给定电视节目(绿箭侠、闪电侠等)的季节值(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.

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

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

更新 1

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

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

这个returns

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

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

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

Django 版本 >=1.8:使用 values_list

您可以访问列列表。

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

您还可以使用:-

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