当我想存储像这样的复杂数据时,如何设计models.py?

时间:2014-08-24 15:21:42

标签: python mysql django

我正在学习使用Django并尝试设计一个旨在推荐音乐的系统。但是,当我考虑如何设计models.py时,我会陷入困惑。

每首歌都有它的标签,例如“悲伤”,“幸福”,“摇滚”,“R& B”,“爵士乐”,“男歌手”......   当用户喜欢有“悲伤”和“摇滚”标签的音乐时,我想录制它。

我应该像这样设计models.py:

class userItem(models.Model):
    userName=models.CharField(max_length=30)
    tags_sadness=models.IntegerField()
    tags_rock=models.IntegerField()
    tags_...

当用户喜欢有“悲伤”和“摇滚”标签的音乐时, tags_sadness和tags_rock的值将增加。

我认为这不是一个好主意...因为有很多标签。但是当它来到django和数据库时,我是一只绿色的手......

你能帮帮我吗?

2 个答案:

答案 0 :(得分:0)

标签可以用逗号(或其他一些字符......)分隔的字符串记录,如"sad,R&B,rock"

class userItem(models.Model):
    userName = models.CharField(max_length=30)
    userTags = models.CharField(max_length=50) # max length of the tags
    ...

答案 1 :(得分:0)

我建议你这样做:

class MusicTag(models.Model):
    tag=models.CharField(max_length=30)

class userItem(models.Model):
    userName=models.CharField(max_length=30)
    tags= models.ManyToManyField(MusicTag)

因此,当您想要保存日期时,可以像以下一样保存:

new_item= userItem() #model class
new_item.userName= "some data"
new_item.save()
if MusicTag.objects.filter(tag='R&R').exists():
   new_item.tags.add( MusicTag.objects.filter(tag='R&R')[0])
else:
   new_tag= MusicTag(tag='R&R')
   new_tag.save()
   new_item.tags.add(new_tag)

现在检索标签的计数:

for item in MusicTag.objects.all():
    print item.tag , item.useritem_set.count()

此模型的优势在于您不必为每个标记创建模型字段,您仍然可以获取每个标记的计数。