我在不同的应用程序中有两个模型:程序中的程序和联系人中的联系人。每个程序可以有许多联系人。我想在程序中有一个名为database_quantity的字段,该字段显示与该程序关联的联系人数量。到目前为止,这是我尝试过的错误提示:ImportError:无法导入名称“ Contact”。我认为这与循环引用有关,但是我对如何继续迷路了。
编程models.py
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
from contacts.models import Contact
class Program(models.Model):
program_code = models.CharField(max_length=6)
program_format = models.ForeignKey(ProgramFormat, models.SET_NULL, blank=True, null=True)
program_type = models.ForeignKey(ProgramType, models.SET_NULL, blank=True, null=True)
program_board = models.ForeignKey(RealEstateBoard, models.SET_NULL, blank=True, null=True)
article_content_type = models.ForeignKey(ArticleContentType, models.SET_NULL, blank=True, null=True)
program_name = models.CharField(max_length=60)
date_created = models.DateTimeField(default=timezone.now)
client = models.ForeignKey(User, on_delete=models.CASCADE)
def get_database_quantity(self):
database_quantity = Contact.objects.all().filter(Contact.author=Program.client)
return database_quantity
database_quantity = property(get_database_quantity)
contacts.py
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
from django.urls import reverse
from programs.models import Program
class Contact(models.Model):
first_name1 = models.CharField(max_length=100, verbose_name='First Name')
last_name1 = models.CharField(max_length=100, verbose_name='Last Name', blank=True)
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)
active_status = models.BooleanField(default=True)
program_code = models.ForeignKey(Program, on_delete=models.DO_NOTHING, null=True, blank=True)
设置已安装的应用
INSTALLED_APPS = [
'blog.apps.BlogConfig',
'users.apps.UsersConfig',
'contacts.apps.ContactsConfig',
'programs.apps.ProgramsConfig',
'crispy_forms',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'import_export',
]
联系apps.py
from django.apps import AppConfig
class ContactsConfig(AppConfig):
name = 'contacts'
答案 0 :(得分:1)
1-您可以使用字符串而不是模型引用来定义ForeignKey映射,如下所示:
program_code = models.ForeignKey('programs.Program', on_delete=models.DO_NOTHING, null=True, blank=True)
因此您无需将其他应用程序的模型导入models.py
2-您的 get_database_quantity 方法中存在一些问题,您需要使用模型实例而不是模型Class进行过滤,即使用self.client而不是Program.client。另外,您不应该像 Contact.author = ... 这样进行过滤,而应该像 author = ... 这样。而且,要获取数量,您需要 .count()个查询集方法。最后,您可以在本地导入其他模型,以避免循环导入问题。
def get_database_quantity(self):
from contacts.models import Contact
database_quantity = Contact.objects.filter(author=self.client).count()
return database_quantity
3-您也可以这样编写get_database_quantity:
def get_database_quantity(self):
return self.client.contacts.count()
如果您这样定义相关的ForeignKey字段:
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='contacts')