我已经设置了两个模型,其中一个模型与另一个模型具有外键关系。由于我有多个数据库,我还设置了一个routers.py文件,因为两个数据库都存在于同一个应用程序中。我一直在阅读并关注here和here的文件,据我所知,我正在遵循文件中的文件。
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
。
答案 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]
实际上,这似乎是由我的两个模型生活在同一个应用程序中引起的。一旦我将它们拆分成自己独立的应用程序,反向关系就开始起作用了。