Django时间系列postgres beginn

2024-04-29 01:08:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用django编写小应用程序,以便学习数据库和web等。 应用程序应显示球员数据并记录一段时间内的统计数据。
回答以下问题:
帕耶在上个月/周/天中随机参加了多少场战斗?图表
哪些玩家离开/进入了部落?-等等

我一直在搜索和阅读,发现了以下建议: 什么是好的技术组合?

MongoDB, InfluxDB, PostgreSQL, RedisDB, or from packages django-timeseries, django-reversion.

我发现我的方法不好,我可能,有人能建议我使用哪个数据库以及模型应该是什么样子吗?在

批评或建议与数据库设计是非常感谢。在

数据以json的形式从第三方API下载。 下载的结构:

在播放器.json在

^{pr2}$

在氏族.json在

{
  "500004323": { # clan ID
    "members": [
      {
        "account_id": 501435906, # PlayerID same as in Player.json
        "account_name": "Player1",
        "joined_at": 1447589992,
        "role": "private",
        "role_i18n": "Private"
      },]
    "name": "Full Clan Name",
    "tag": "TAG",
}

在据点.json在

{
  "500323931": { # PlayerID
    "stronghold_skirmish": null,
    "total_resources_earned": 0,
    "week_resources_earned": 0
  }, # next player follows
}

我的方法: 合并数据

{
  "500004323": {
    'name': 'Full Clan Name',
    'tag': 'TAG'
    "members": {
      "500012979": {
        "account_id": "500012979",
        "account_name": "Player1",
        "joined_clan_date": 1415990768,
        "last_battle_time": 1484160229,
        "role": "Commander",
        "statistics": {
          "all": {
            "battles": 70555
          },
          "random": {
            "battles": 67361
          }
        },
        "stronghold": {
          "stronghold_skirmish": {
            "battles": 2223
          },
          "total_resources_earned": 32582,
          "week_resources_earned": 80
        }
      }, # next members
    }, # next clan
}

并将这些数据导入以下模型:

class Clan(models.Model):
    """Clan model"""
    clan_id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=100)
    tag = models.CharField(max_length=5)

    @property
    def members(self):
        return Player.objects.filter(clan=self)

    def kick_player(self, player):
        player.leave_clan()

class PlayerLeaversManager(models.Manager):

    def leave_clan(self, players):
        """Take list of players and remove them from their clan
        :param players:
        """
        for player in players:
            player.leave_clan()

class Player(models.Model):
    """Player model"""
    account_id = models.IntegerField(primary_key=True)
    access_token = models.TextField(blank=True,
                                    null=True)
    access_token_expires_at = models.CharField(max_length=10,
                                               blank=True,
                                               null=True)
    account_name = models.CharField(max_length=250)


    clan = models.ForeignKey('Clan',
                               on_delete=models.CASCADE,
                               blank=True,
                               null=True,
                            related_name='current_clan')

    previous_clan = models.ForeignKey('Clan',
                               on_delete=models.CASCADE,
                               blank=True,
                               null=True,
                            related_name='previous_clan')

    # objects = models.Manager()
    objects = PlayerLeaversManager()


    def __str__(self):
        return '{0} - {1}'.format(self.account_name, self.account_id)

    def get_absolute_url(self):
        return reverse('wot:player_detail',
                       args=[self.account_name])

    def leave_clan(self):
        self.previous_clan = self.clan
        self.clan = None
        self.save()

class PlayerData(models.Model):
    """Players data daily tracked"""
    created = models.DateTimeField(auto_now_add=True)

    player = models.ForeignKey('Player',
                               on_delete=models.CASCADE,
                               null=True,
                               blank=True
                               )

    joined_clan_date = models.DateTimeField(blank=True,
                                             null=True)

    role_in_clan = models.CharField(max_length=250,
                                    blank=True,
                                    null=True)

    battles_on_random = models.IntegerField(blank=True,
                                               null=True)
    battles_all = models.IntegerField(blank=True,
                                      null=True)
    battles_stronghold = models.IntegerField(blank=True,
                                             null=True)

    tank = models.ManyToManyField('Vehicle',
                                    related_name='tanks',
                                    blank=True,)

    last_battle_time = models.DateTimeField(blank=True,
                                             null=True)
    # stronghold stats
    total_resources_earned = models.IntegerField(blank=True, null=True)

    week_resources_earned = models.IntegerField(blank=True, null=True)

整个代码可以在我的github上找到https://github.com/1oglop1/anv_wot 谢谢你的建议。在


Tags: nameselftruemodelsdefaccountnullplayer