Django表关系的解释以及如何调用它们

时间:2018-02-24 04:32:08

标签: python mysql django class models

我是Django的新手,目前我正在尝试修改一个已有的网站。我正在尝试理解基于某些参数创建图表所涉及的语法。目前,该网站将帐户类型作为参数,并吐出帐户值与年份的关系图。如第一张图所示: Picture of Plot

我感到困惑的部分代码在这里:

tag_ids = [56, 123, 15, 21, 82]
if categories_1:
    tag_ids = categories_1.split(',')

tags = []


funding_announced_min = minyear+'-01-01'
funding_announced_max = maxyear+'-12-31'

business_list = []
for d in tag_ids:
    tag1 = Tag_objs.objects.get(pk=int(d))
    tags.append(tag1)
    business_1 = tag1.buisiness.filter(
        company__founded_date__gte=funding_announced_min,
        company__founded_date__lte=funding_announced_max,
        entity_type=0,
        )
    business_list.append(business1)

tag是一个帐户类型表,我的混淆来自b usiness_1 = tag1.business.filter部分。这究竟是做什么的?

我有一个名为biz的模型,如下所示:

class biz(Ent):  
founded_date = models.DateField(blank=True, null=True)
employee_amount = models.IntegerField('Number of Employees',blank=True, null=True)
employee_amount_range = models.CharField(max_length=64, blank=True, null=True)
biz_status = models.CharField(choices=BIZ_STATUS_CHOICES, max_length=32, default='operating', blank=True, null=True)
zipcode = models.CharField(max_length=64, blank=True, null=True)
address = models.CharField(max_length=255, blank=True, null=True)
funding_rounds = models.IntegerField(default=0, blank=True, null=True)
funding_total_usd = models.BigIntegerField(default=0, blank=True, null=True)
first_funding_on = models.DateField(blank=True, null=True)
last_funding_on = models.DateField(blank=True, null=True)
closed_on = models.DateField(blank=True, null=True)
employee_count_min = models.IntegerField(default=0, blank=True, null=True)
employee_count_max = models.IntegerField(default=0, blank=True, null=True)

def __str__(self):  
    return self.name

class Meta:
    verbose_name_plural = "business"

但我可以看到business的唯一一个模型引用的实例位于verbose_name_pluralverbose_name_plural是否意味着我可以将表biz称为“业务”? ent课程在这里:

class Ent(models.Model):
name = models.CharField('Name', max_length=255, db_index=True) 
desc = models.TextField('Description')
image = models.ImageField('Logo Image', upload_to='biz', blank=True, null=True, default='biz/default-user110.jpg')
cover_image = models.ImageField('Cover Image', upload_to='biz', blank=True, null=True, help_text='1300 width by 300 height top cover image.')
tags = models.ManyToManyField(Tag,related_name='business', blank=True)
featured = models.BooleanField()
limited = models.BooleanField()
city = models.CharField(max_length=128) 
state_province = models.CharField(max_length=128, blank=True, null=True) 
region = models.CharField(max_length=128, blank=True, null=True) 
country = models.CharField(choices=COUNTRY_CHOICES, max_length=128)
entity_type = models.IntegerField(choices=ENTITY_TYPE_CHOICES)
elevator_pitch = models.CharField(max_length=64, blank=True, null=True)
logo_url = models.URLField(max_length=255, blank=True, null=True)
profile_image_url = models.URLField(max_length=255, blank=True, null=True)
primary_role = models.CharField(max_length=32, blank=True, null=True)
uuid = models.CharField(max_length=128, blank=True, null=True, unique=True)
domain = models.CharField(max_length=255, blank=True, null=True)
slug = models.SlugField(max_length=255, blank=True, null=True, unique=True)
created_at = models.DateTimeField(auto_now_add = True)
updated_at = models.DateTimeField(auto_now = True)

def __str__(self):  
    return self.name

def get_absolute_url(self):

    try:
        int(self.slug[-1:])
        if self.slug.replace('-', ' ').lower() == self.name.lower():
            return reverse('business:biz', kwargs={'slug':slugify(self.name)})
        self.slug=slugify(self.name+' '+str(self.pk))
        return reverse('business:biz', kwargs={'slug':slugify(self.name+' '+str(self.pk))})
    except ValueError:
        self.slug=slugify(self.name)
        return reverse('business:biz', kwargs={'slug':slugify(self.name)})

据我所知,类biz是类ent的一种类型,而行business.filter正在对ent创建的ent表进行排序模型。如果有人能给我一个关于这条线的简短解释,然后表格如何沟通,我会非常感激。如果这有点令人困惑,我很抱歉,我是新人,这是我的第一篇文章。在以前的搜索中我找不到任何类似的东西。

2 个答案:

答案 0 :(得分:0)

Biz模型继承自Ent。 Ent与Tag_obj模型具有多对多关系,并将反向访问器定义为business,这意味着从Tag中可以使用该名称访问相关的Biz对象。

答案 1 :(得分:0)

verbose_name_plural专为管理界面而设计,而非ORM关系。

关于结构的一些高级建议:

  1. 让biz引用Ent而不是继承它。这可能会造成一些混乱。
  2. 限制try/except函数中的Ent.get_absolute_url块,只进行slug解析。
  3. 将上述方法(2)中的url解析推入其自己的clean方法。
  4. 确保在插入之前清除Ent上的Pk字段;那里有SQL注入责任。
  5. 对于您的网址名称business:detailbusiness:biz
  6. 更清晰,更传统
  7. Ent.uuid中的uuid字段应该有一个default=uuid.uuid4参数,让您的生活更轻松。如果你打算只使用postgres,还有一个内置的django课程 - https://docs.djangoproject.com/en/2.0/ref/models/fields/#uuidfield