Django 使用旧模型按ForeignKey进行筛选不会';没有pk,我就不能工作

Django 使用旧模型按ForeignKey进行筛选不会';没有pk,我就不能工作,django,django-models,django-queryset,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_lengt

我有一个遗留数据库,我已经设置了一些模型来使用。模型如下所示:

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
SELECT COUNT(*) FROM `legacy_other_model` WHERE `legacy_other_model`.`uid` = 12345
但是如果我将计数查询更改为此(注意.pk):

我得到的SQL看起来像:

SELECT COUNT(*) FROM `legacy_other_model` WHERE `legacy_other_model`.`uid` = None
SELECT COUNT(*) FROM `legacy_other_model` WHERE `legacy_other_model`.`uid` = 12345
这似乎不是预期的行为,看看:


我的模型设置错误了吗?

怀疑您可能需要在OneTONE定义中指定
to_字段

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

这有帮助吗?

在这一点上,我认为这是Django中的一个bug

为了将来参考,我在这里报告:

只是一个粗略的猜测-可能那些对相关对象的查询有缺陷,因为它们假设主键总是
id
。如果没有人回答这个问题,您可以检查Django bug tracker.to_字段中是否报告了类似的情况,默认为相关模型的主键。指定它没有帮助-它仍然会在SQL中设置“无”。