django模型的正确结构

时间:2016-05-24 08:16:41

标签: python django django-models

我正在尝试使用django模型存储以下JSON响应。每次下注都可以有多个已下注的项目。在这种情况下,我们的用户'Nine'下注两项:'Some Item Name'和'Another Item Name'

 {'bet_id' : 234442288
 'user_id':  5554433
 'user_name': 'Nine'
 'item':    [{'name':   'Some Item Name',
             'item_id':  10,
             'rarity':  'Common'},
             {'name':   'Another Item Name',
              'item_id': 19,
              'rarity': 'Rare'}]

我创建了两个模型,一个用于下注,一个用于项目。

class Bet(models.Model):
   bet_id = models.IntegerField()
   user_id = models.IntegerField()
   user_name = models.CharField(max_length=200)

class Item(models.Model):
   bet = models.ForeignKey(Bet)
   item_id = models.IntegerField()
   name = models.CharField(max_length=200)
   rarity = models.CharField(max_length=200)

目标是能够确切地知道谁下注了哪些项目并且知道总共下注了多少项目。然而问题是我现在存储了许多重复的项目。 Items.objects.all()现在将返回['Some Item Name','Some Item Name','Another Item Name']。这是一种效率低下的方式还是存储我的数据,如果是这样,我该如何改进呢?

1 个答案:

答案 0 :(得分:0)

引用你The goal is to be able to know exactly who has bet which items and to know how many items have been bet in total.

对于第二个问题,对于重复项目,如果您假设将会在一段时间内重复下注相同的项目,您可以尝试将项目模型(从那里删除外键)分开并将项目作为Bet模型中的M2M字段。通过这个你可以实现的是如下

  • 通过检查项目是否已存在,您可以在创建项目之前避免重复项目。

您可以考虑将模型更改为此类

class Item(models.Model):
    item_id = models.IntegerField()
    name = models.CharField(max_length=200)
    rarity = models.CharField(max_length=200)


class Bet(models.Model):
    bet_id = models.IntegerField()
    user_id = models.IntegerField()
    user_name = models.CharField(max_length=200)
    items = models.ManyToManyField(Item)

但这是基于假设稀有 item_id 对于项目始终相同。