什么是Django ORM相当于SELECT col1 FROM table WHERE col2 = somestring?

时间:2016-08-02 01:19:15

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

模型

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.

2 个答案:

答案 0 :(得分:2)

是的,您可以使用values() queryset方法。

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

更新1

如果您想要原始表示,则需要在values_list

上使用flat=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]

答案 1 :(得分:0)

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

您可以访问列列表。

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

您也可以使用: -

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