Django数据库中多选项的选项

时间:2017-11-22 22:07:50

标签: python django database-design model

我正在为我的新闻聚合应用设计模型,视图和模板。我希望模板为用户提供包含数据库选项的多选字段表单。我如何在我的模型中设计这个?

我正在阅读有关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)


     '''''

2 个答案:

答案 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字段,从而允许在生成表单时动态确定可用选项列表。

用户< - >流关系中的有效选项列表已经受到关系的约束,因此在模型字段中指定可用选项没有任何好处。