2016-08-22 91 views
2

我建立了两个模型,其中一个与另一个具有外键关系。由于我有多个数据库,所以我还设置了一个routers.py文件,因为两个数据库都存在于同一个应用程序中。我一直在阅读和跟踪发现herehere的文档,据我所知,我正在按照文件的信件。Django反向外键关系失败

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: Cannot resolve keyword 'users' into field. Choices are: active, customer_id, name

每例子文档中:

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

这应该工作。我在这里错过了什么?


作为参考点我已经尝试下面还有:

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

除了在customers ForeignKey的设置related_name='users'

+0

你知道你的'Users'类没有'username'字段,对吗? –

+0

@ChristianTernus对此感到遗憾,当我删除剩余的部分时必须删除它。请放心,它现在在这个例子中,当然在我的数据库中。 – beardedeagle

回答

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] 

它实际上看来,这是由我的两个模型引起的生活在同一个应用程序中。一旦我将它们分成独立的应用程序,反向关系就开始奏效。