如果没有.pk,使用传统模型过滤ForeignKey是行不通的

时间:2011-01-25 00:33:09

标签: django django-models django-queryset

我有一个遗留数据库,我已经设置了一些模型可供使用。模型看起来像这样:

class UserProfile(models.Model):
    user = models.OneToOneField(User, primary_key=True, db_column='uid')
    email = models.CharField(max_length=255, unique=True)
    username = models.CharField(unique=True, max_length=150)
    class Meta:
        db_table = u'legacy_user'

class OtherModel(models.Model):
    user = models.ForeignKey('my_app.UserProfile', db_column='uid')
    some_data = models.IntegerField()
    another_model = models.ForeignKey('other_app.AnotherModel', db_column='related')
    class Meta:
        db_table = u'legacy_other_model'

当我执行此查询集时:

my_user = UserProfile.objects.get(username='foo')
count = OtherModel.objects.filter(user=my_user).count()

我得到的SQL看起来像:

SELECT COUNT(*) FROM `legacy_other_model` WHERE `legacy_other_model`.`uid` = None

但如果我将计数查询更改为此(请注意 .pk ):

count = OtherModel.objects.filter(user=my_user.pk).count()

我得到的SQL看起来像:

SELECT COUNT(*) FROM `legacy_other_model` WHERE `legacy_other_model`.`uid` = 12345

这似乎不是预期的行为,请查看:http://docs.djangoproject.com/en/dev/topics/db/queries/#queries-over-related-objects

我的模特中是否设置了错误的内容?

2 个答案:

答案 0 :(得分:0)

怀疑您可能需要在OneToOne定义中指定to_field

user = models.ForeignKey('my_app.UserProfile', db_column='uid', to_field='user')

这有帮助吗?

答案 1 :(得分:0)

此时,我相信这是Django中的一个错误。

为了将来参考,我在此报告: http://code.djangoproject.com/ticket/15164