我正在构建一个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 repository
,repository with most commits
,most replied to comments
之类的东西。我希望能够对数据运行某种filters
,以便提取出这些指标,但是我知道这在很大程度上取决于架构设置。
谢谢!
答案 0 :(得分:0)
将字段设置为主键的方法是
field_name = models.FieldType(primary_key=True)