Использование модели как множественного поля другой модели в Django - PullRequest
0 голосов
/ 19 апреля 2019

Я создаю музыкальное приложение.У меня есть модель «Трек», и я хочу позволить пользователю создавать плейлист, который может содержать несколько треков.Мои поиски не помогли мне сделать это.(Также один трек можно использовать в нескольких плейлистах, например, трек «XXX» можно использовать в плейлисте «YYY» и в плейлисте «ZZZ»).

Вот модели.py:

from django.db import models
from django.contrib.auth.models import User
from .validators import *

#Model that accutaly contains user's tracks/songs
class Track(models.Model):
    title = models.CharField(max_length=40, null=True)
    description = models.CharField(max_length=500, null=True)
    author = models.ForeignKey(User, default=None, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    miniature = models.ImageField(upload_to='images/track', default="defaults/default.png", validators=[validate_miniature_file_extension])

    audio_or_video = models.FileField(upload_to='audio_and_video/', default="file_not_found", validators=[validate_track_file_extension])

#Model that contains playlists
class Playlist(models.Model):
    title = models.CharField(max_length=40, null=True)
    description = models.CharField(max_length=500, null=True)
    author = models.ForeignKey(User, default=None, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    miniature = models.ImageField(upload_to='images/playlist', default="defaults/default.png", validators=[validate_miniature_file_extension])

    Tracks = models.ForeignKey(Track, default=None, on_delete=models.CASCADE) # I tried this, but it won't work at all because it can contain only one Track

1 Ответ

2 голосов
/ 19 апреля 2019

1 / В классе списка воспроизведения атрибуты должны быть в нижнем регистре : tracks, а не Tracks.

2 / Поскольку дорожка может быть связана со многими списками воспроизведения и списком воспроизведения со многими дорожками, вам потребуется ManyToManyField (вместо ForeignKey):

tracks = models.ManyToManyField(Track)

3 / Тогда вы можете добавить столько треков, сколько захотите :

playlist.tracks.add(tracks1)
playlist.tracks.add(tracks2)
...

Нет необходимости использовать метод .save() при добавлении треков с .add()

Ссылка:

ForeignKey: https://docs.djangoproject.com/fr/2.1/ref/models/fields/#foreignkey

ManyToMany: https://docs.djangoproject.com/fr/2.1/ref/models/fields/#manytomanyfield

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...