2016-08-22 4 views
2

하나는 외부 키 관계가있는 두 모델을 설정했습니다. 여러 데이터베이스가 있기 때문에 두 데이터베이스가 동일한 응용 프로그램에 있기 때문에 routers.py 파일도 설정합니다. 나는이 문서를 읽고이어서 따라 갔고 herehere을 찾았고 나는 문서에 따라 편지를 쓰고 있다고 말할 수있다.Django 역방향 foreignkey 관계가 실패했습니다

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 

AbstractBaseUser에서 파생없이 나는 users 테이블을 가지고 잠시 무시 models.py 나는 다음과 같은 쿼리를 실행할 때 :

문서에

django.core.exceptions.FieldError: Cannot resolve keyword 'users' into field. Choices are: active, customer_id, name

예 당 : 10

나는 다음과 같은 오류가

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

이 작동합니다. 내가 여기서 무엇을 놓치고 있니?

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

뿐만 아니라 customers 외래 키에 related_name='users' 설정 : 기준점으로


나는 이미뿐만 아니라 다음과 같은 노력했다.

+0

'사용자'클래스에'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] 
실제로는 내 모델 모두에 의해 발생 된 것으로 보인다

같은 응용 프로그램에 살고 있습니다. 일단 내가 그들을 분리 된 앱으로 나눠서, 역관계가 작동하기 시작했다.

관련 문제