我正在为我的新闻聚合应用设计模型,视图和模板。我希望模板为用户提供包含数据库选项的多选字段表单。我如何在我的模型中设计这个?
我正在阅读有关ManyToManyField的Django文档(有记者和文章的那篇文章),但我不认为这是非常正确的关系,因为在我的情况下,“文章”可以在没有文章的情况下没有记者和记者的情况下存在。
我有用户。我有Streams。 Streams是一组新闻网站,用户可以注册以关注并查看汇总的标题摘要,例如来自CNN,Twitter,Google新闻等等。流可以不存在用户。 Stream可以拥有许多用户。用户可以没有Streams,实际上所有用户帐户都在我的应用程序中启动,没有Streams,直到他们选择一个。用户可以拥有多个Streams。
在模板中,我想创建一个包含数据库中所有Stream选项列表的表单(这可能会随着我将来提供更多选项而改变)。当用户选择流时,它将被添加到其仪表板视图中。他们可以添加和删除Streams。但是,只有1个Twitter,1个Google新闻等来源。我无法使用User模型中的典型选项,我希望它是“动态的”并直接从Streams数据库中提取。
这就是我现在所拥有的,但我知道这不对:
流/ models.py
from django.db import models
from django.contrib.auth.models import User
class Stream(models.Model):
user = models.ManyToManyField(User, blank=True, null=True)
name = models.CharField(max_length=30)
用户/ models.py
from django.db import models
class User(models.Model):
name = models.CharField(max_length=30)
'''''
#TODO: make this dynamic, streams is pulling from Streams model
streams = (
('Google News'),
('Yahoo News'),
('Twitter'),
('CNN'),
('New York Times'),
('NBC News'),
('Huffington Post')
)
stream_choices = models.CharField(max_length=9, choices=streams)
'''''
答案 0 :(得分:0)
只需为流列表添加一个模型,为用户选择的流添加另一个模型
class Stream(models.Model):
name = models.CharField(max_length=50)
class UserStream(models.Model):
user = models.ForeignKey(User)
name = models.ForeignKey(Stream)
那就是它。将可能的流插入Stream
模型和用户选择的流到UserStream
模型。
答案 1 :(得分:0)
ManyToManyField
已隐式创建接受答案中描述的“中间表”。根据文件:
在幕后,Django创建了一个中间连接表 代表多对多的关系。
您可以将可调用对象传递给您向用户显示的choices
ChoicesField
字段,从而允许在生成表单时动态确定可用选项列表。
用户< - >流关系中的有效选项列表已经受到关系的约束,因此在模型字段中指定可用选项没有任何好处。