在Django模型中,如何用`timestamp`作为主键覆盖`id`作为主键?

时间:2019-05-18 00:53:00

标签: python mysql django orm

我正在构建一个Django ETL引擎,该引擎使用企业API从GitHub提取数据,以收集有关公司内部合作的指标。我已经设计了一些由于ORM自动设置的PK(主键)而无法扩展的架构。提取的主要功能之一是获取id已创建存储库,在帖子中发表评论的人等。

我最初的想法是让ORM自动将id设置为PK,但是由于GET请求每周要运行一次,因此这将无法正常工作,并且会引起错误,导致覆盖ID主键失败。

我已经进行了一些研究,一种可能的解决方案是创建一个此处引用的元类:Django model primary key as a pair

但我不确定创建一些元类是否会破坏一开始的元类的整个观点。

这是我为models.py设置的架构

from django.db import models
from datetime import datetime

""" Contruction of tables in MySQL instance """


class Repository(models.Model):
    id = models.PositiveIntegerField(null=False, primary_key=True)
    repo_name = models.CharField(max_length=50)
    creation_date = models.CharField(max_length=21, null=True)
    last_updated = models.CharField(max_length=30, null=True)
    qty_watchers = models.PositiveIntegerField(null=True)
    qty_forks = models.PositiveIntegerField(null=True)
    qty_issues = models.PositiveIntegerField(null=True)
    main_language = models.CharField(max_length=30, null=True)
    repo_size = models.PositiveIntegerField(null=True)
    timestamp = models.DateTimeField(auto_now=True)

class Contributor(models.Model):
    id = models.IntegerField(null=False, primary_key=True)
    contributor_cec = models.CharField(max_length=30, null=True)
    contribution_qty = models.PositiveIntegerField(null=True)
    get_request = models.CharField(max_length=100, null=True)
    timestamp = models.DateTimeField(auto_now=True)


class Teams(models.Model):
    id = models.IntegerField(primary_key=True, null=False)
    team_name = models.CharField(max_length=100, null=True)
    timestamp = models.DateTimeField(auto_now=True)


class TeamMembers(models.Model):
    id = models.IntegerField(null=False, primary_key=True)
    team_member_cec = models.CharField(max_length=30, null=True)
    get_request = models.CharField(max_length=100, null=True)
    timestamp = models.DateTimeField(auto_now=True)


class Discussions(models.Model):
    id = models.IntegerField(null=False, primary_key=True)
    login = models.CharField(max_length=30, null=True)
    title = models.CharField(max_length=30, null=True)
    body = models.CharField(max_length=1000, null=True)
    comments = models.IntegerField(null=True)
    updated_at = models.CharField(max_length=21, null=True)
    get_request = models.CharField(max_length=100, null=True)
    timestamp = models.DateTimeField(auto_now=True)

是否有一种方法可以覆盖id字段并使PK成为timestamp字段,因为每次运行GET request时,该字段将填充静态数据在应用程序的生命周期内不会改变?

或者,有没有办法抛弃多表继承体系结构而去做别的事情呢?

我将要从中提取的核心指标是诸如top contributor to repositoryrepository with most commitsmost replied to comments之类的东西。我希望能够对数据运行某种filters,以便提取出这些指标,但是我知道这在很大程度上取决于架构设置。

谢谢!

1 个答案:

答案 0 :(得分:0)

将字段设置为主键的方法是

field_name = models.FieldType(primary_key=True)