Django:如何在数据库中存储日期列表和当天听的歌曲?
Posted
技术标签:
【中文标题】Django:如何在数据库中存储日期列表和当天听的歌曲?【英文标题】:Django: How to store in the database a list of dates and the songs someone listen that day? 【发布时间】:2020-02-22 09:30:14 【问题描述】:假设我有 2 个模型 Song 和 Person:
class Person(models.Model):
name = models.CharField(max_length=128)
def __str__(self):
return self.name
class Song(models.Model):
name = models.CharField(max_length=128)
def __str__(self):
return self.name
我想在 Person 模型中创建一个字段来存储此人听音乐的日期以及他们听的歌曲的列表。
2019-10-2 -> (Song 3, Song 25, Song 50)
2019-10-3 -> (Song 4, Song 5, Song 12)
2019-10-7 -> (Song 77, Song 22, Song 11)
ManyToMany 字段似乎适用于链接到另一个模型的一个或多个实例,但在这种情况下似乎没有用。
我可以使用任何类型的字段吗?或者有没有其他方法来存储所有这些信息?
我能想到的唯一另一种方法是创建一个这样的模型,并有一个表格,其中包含每个人都听过的所有歌曲,并将它们链接到每个用户并添加日期:
class Song(models.Model):
person = models.OneToOneField(Person)
date = models.DateField()
songs = models.ManyToManyField(Song)
我对数据库和 django 还很陌生,所以我不确定哪种是存储此类信息的正确方法。在此人的个人资料下还是在其他表格中?
谢谢!
【问题讨论】:
【参考方案1】:我会创建第三个模型,听,它将人和歌曲联系起来并记录哪个日期。这样,如果您的人物或歌曲模型变得更复杂,您将不会有重复的数据。一般来说,您需要一个表格来记录您正在录制的每种“事物”,在这种情况下,您有一个人、一首歌和一个听,这是与日期相关联的两者之间的链接。
class Person(models.Model):
name = models.CharField(max_length=128)
def __str__(self):
return self.name
class Song(models.Model):
name = models.CharField(max_length=128)
def __str__(self):
return self.name
class Listens(models.Model):
song = models.ForeignKey(Song, on_delete=models.Cascade)
date = models.DateTimeField()
person = ForeignKey(Person, on_delete=models.Cascade)
【讨论】:
所以这将是每首歌曲一个条目,而不是我的示例每天一个条目? 是的!然后要获取给定日期的所有歌曲,您将过滤数据。 @AlvaroBataller 抱歉,我打错了,我的意思是输入DateTimeField()
,因为同时记录日期和时间是您不会得到重复数据的原因。以上是关于Django:如何在数据库中存储日期列表和当天听的歌曲?的主要内容,如果未能解决你的问题,请参考以下文章