0

ユーザーがアイテムをプレイリストに保存できる機能を作成しようとしています。ユーザーは複数のプレイリストを持つことができます。各アイテムは、複数のプレイリストに保存することもできます。このデータを表現する最良の方法は何ですか? それらをリンクする外部キーを持つ複数のテーブル、または 1 つのフラット テーブルだけですか?

複数のテーブル

class Playlist(models.Model):
    playlist = models.CharField('Playlist', max_length = 2000, null=True, blank=True)
    def __unicode__(self):
        return self.playlist
    
class Video(models.Model):
    video_url = models.URLField('Link to video', max_length = 200, null=True, blank=True)
    video_tag = models.CharField('Video ID', max_length = 2000, null=True, blank=True)
    def __unicode__(self):
        return self.video_url

class UserPlaylist(models.Model):
    profile = models.ForeignKey(User)
    playlist = models.ForeignKey(Playlist)
    def __unicode__(self):
        return unicode(self.playlist)

class Videoplaylist(models.Model):
    video = models.ForeignKey(Video)
    playlist = models.ForeignKey(UserPlaylist)
    def __unicode__(self):
        return unicode(self.playlist)

1テーブル

class Everything(models.Model):
    profile = models.ForeignKey(User)
    playlist = models.CharField('Playlist', max_length = 2000, null=True, blank=True)
    platform = models.CharField('Platform', max_length = 2000, null=True, blank=True)
    video = models.CharField('VideoID', max_length = 2000, null=True, blank=True)
    def __unicode__(self):
        return u'%s %s %s %s' % (self.profile, self.playlist, self.platform, self.video)
4

1 に答える 1

1

エンティティ間には主に 2 つの関係があります。

  • プレイリスト --> ユーザー、多対 1
  • ビデオ --> プレイリスト、多対多

上記に基づいて、次のような方法でデータを配置する必要があります。

class User():
    name = CharField()
    # other user info

class Video():
    name = CharField()
    # othter video info

class Playlist():
    user = ForeigenKey(User)
    name = CharField()

class PlaylistVideo():
    plist = ForeigenKey(Playlist)
    video = ForeigenKey(Video)

# When a user adds a video to one of his playlist
def add_video_to_playlist(user_name, playlist_name, video_name)
    user = User.objects.get(name=user_name)
    plist = Playlist.objects.get(user=user, name=playlist_name)

    video = Video.objects.get(name=video_name)
    plv = PlaylistVideo(plist=plist,video=video)
    plv.save()

# To get the content of a user's some playlist:
def get_playlist_content(user_name, playlist_names):
    user = User.objects.get(name=user_name)
    plist = Playlist.objects.get(user=user, name=playlist_name)

    return [plv.video for plv in PlaylistVideo.objects.filter(plist=plist)]
于 2012-11-16T05:25:33.843 に答える