django - 在 Django 中将模型用作另一个模型的多个字段
问题描述
我正在创建一些音乐应用程序。我有“曲目”模型,我想让用户创建可以包含多个曲目的播放列表。我的搜索并没有帮助我做到这一点。(也可以在多个播放列表中使用一个曲目,例如曲目“XXX”可以在播放列表“YYY”和播放列表“ZZZ”中使用)。
这是models.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/在 Playlist 类中,属性应该是小写的:tracks
而不是Tracks
。
2/因为一个曲目可以与许多播放列表相关,而一个播放列表与许多曲目相关,您需要一个 ManyToManyField(而不是 ForeignKey):
tracks = models.ManyToManyField(Track)
3/然后您可以添加任意数量的曲目:
playlist.tracks.add(tracks1)
playlist.tracks.add(tracks2)
...
.save()
添加曲目时无需使用方法.add()
参考:
外键: https ://docs.djangoproject.com/fr/2.1/ref/models/fields/#foreignkey
多对多: https ://docs.djangoproject.com/fr/2.1/ref/models/fields/#manytomanyfield
推荐阅读
- matplotlib - Visibility of lines in a 3D plot
- asp.net-core - What's wrong with my PATCH request body in Swagger?
- python - torch.cuda.is_available() 仅在 Jupyter Lab/Notebook 中为 False
- node.js - 在 macOS Big Sur 上安装后 mongod 命令不起作用,在下方显示此错误。尝试了一切都没有奏效
- javascript - iframe 未在 chrome 浏览器中从同一域下的链接标签加载 css
- javascript - javascript在foreach循环中获取推送数组
- python - 如何从 x 中有几列的数据框中绘制分组条形图?
- bash - Sed - 查找和替换 html 代码中的文本(从一种语言到另一种语言)
- firebase - 将多个条目推送到 Firebase RTDB
- python - 处理有冲突的 python 依赖项