我建立了两个模型,其中一个与另一个具有外键关系。由于我有多个数据库,所以我还设置了一个routers.py文件,因为两个数据库都存在于同一个应用程序中。我一直在阅读和跟踪发现here和here的文档,据我所知,我正在按照文件的信件。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'
。
你知道你的'Users'类没有'username'字段,对吗? –
@ChristianTernus对此感到遗憾,当我删除剩余的部分时必须删除它。请放心,它现在在这个例子中,当然在我的数据库中。 – beardedeagle