Django反向外键关系失败

时间:2016-08-22 16:10:30

标签: django django-models

我已经设置了两个模型,其中一个模型与另一个模型具有外键关系。由于我有多个数据库,我还设置了一个routers.py文件,因为两个数据库都存在于同一个应用程序中。我一直在阅读并关注herehere的文件,据我所知,我正在遵循文件中的文件。

models.py

class Customers(models.Model):
    customer_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100)
    active = models.IntegerField()

    class Meta:
        db_table = 'customers'
        app_label = 'db1'

class Users(models.Model):
    user_id = models.AutoField(primary_key=True)
    customer = models.ForeignKey(Customers, models.CASCADE)
    username = models.CharField(max_length=35)
    role = models.ForeignKey(Roles, models.CASCADE)
    active = models.IntegerField()

    class Meta:
        db_table = 'users'
        app_label = 'db1'

routers.py

class BackendRouter(object):

    def db_for_read(self, model, **hints):
        if model._meta.app_label == 'db1':
            return 'default'
        elif model._meta.app_label == 'db2':
            return 'db2'
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label == 'db1':
            return 'default'
        elif model._meta.app_label == 'db2':
            return 'db2'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        if obj1._meta.app_label == 'db1' or \
           obj2._meta.app_label == 'db1':
           return True
        elif obj1._meta.app_label == 'db2' or \
            obj2._meta.app_label == 'db2':
            return True
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if app_label == 'db1':
            return db == 'default'
        elif app_label == 'db2':
            return db == 'db2'
        return None

当我运行以下查询时,忽略我有一个users表但没有派生AbstractBaseUser

Customers.objects.filter(users__username__contains='sl')

我收到以下错误:

  

django.core.exceptions.FieldError:无法解析关键字'用户'成   领域。选项包括:active,customer_id,name

根据文档中的示例:

Blog.objects.filter(entry__headline__contains='Lennon')

这应该有效。我在这里缺少什么?

作为参考点,我已经尝试了以下内容:

Customers.objects.filter(users_set__username__contains=‘sl’)

以及在related_name='users' ForeignKey上设置customers

1 个答案:

答案 0 :(得分:0)

根据文档,似乎我应该能够过滤我在问题中的方式,而不是遇到问题。但是,在做“反向”关系时,我不确定是否可以实际过滤多个对象。我通过以下解决方案实现了我想要的目标:

user = Users.objects.filter(username='someuser').only('customer_id')
customer = Customers.objects.filter(customer_id__in=user)

我确信有一种更有效的方法。像这样:

Users.objects.filter(username='someuser').values_list('customer__name', flat=True)[0]

我认为如果能通过以下方式得到我需要的东西会更好:

Customers.objects.filter(users__username='someuser').values_list('name', flat=True)[0]
实际上,这似乎是由我的两个模型生活在同一个应用程序中引起的。一旦我将它们拆分成自己独立的应用程序,反向关系就开始起作用了。