计算其他模型中的对象数量

时间:2019-03-29 22:17:46

标签: django django-models

我在不同的应用程序中有两个模型:程序中的程序和联系人中的联系人。每个程序可以有许多联系人。我想在程序中有一个名为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'

1 个答案:

答案 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')