Django: Как сохранить в базе данных список дат и песен, которые кто-то слушает в этот день? - PullRequest
1 голос
/ 26 октября 2019

Представьте, что у меня есть 2 модели Song and 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 Ответ

1 голос
/ 26 октября 2019

Я бы создал третью модель, слушает, которая связывает человека и песню и записывает дату. Таким образом, если ваши персонажи или модели песен станут более сложными, у вас не будет дублированных данных. В общем, вам нужна таблица для каждого вида «вещи», которую вы записываете, в этом случае у вас есть человек, песня и слушатель, что является связующим звеном между двумя, связанными с датой.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...