多对多和多对一的关系

时间:2011-03-07 22:33:06

标签: django data-modeling

如果有人可以在我的代码中验证多对多和多对一关系,我将非常感激:

项目:

1-有不同的“类别”(例如:'世界新闻''欧洲''商业''体育');这些“类别”将被预定义,并且应该更改一次(添加新/删除条目)

2-“news”与一个“类别”相关联。

3-“用户”可以根据需要注册到尽可能多的“类别”(目标是开发一个显示“新闻”的网站,该网站属于“用户”注册的“类别”。

4- A用户可以选择从他的“新闻源”中删除新闻。发生这种情况时,“丢弃的”布尔字段设置为True(请参阅“新闻”类)。

class Category(models.Model):
    category = models.CharField(max_length=50)

class News(models.Model):
    question = models.CharField(max_length=100)
    pub_date = models.DateTimeField()
    discarded = models.BooleanField()
    category = models.ForeignKey(Category)

class User(models.Model):
    name = models.CharField(max_length=50)
    subscribed_category = models.ManyToManyField(Category)

问题:

如果您能够验证在代码中正确实现foreignKey和manytomany字段,我将非常感激。任何改进都将受到欢迎:)

2 个答案:

答案 0 :(得分:1)

不,这不太对劲。问题出在discarded属性上。如果我理解正确,News对象是特定类别中的项目,因此它与特定用户无关。如果您在新闻对象上设置discarded,则会为所有用户设置{。}}。

然而,如何对此进行建模并不完全明显,因为用户和新闻之间(正确)没有任何关系。在这两个表之间需要一些额外的ManyToMany,以保存丢弃的项目:

class User(models.Model):
    ...
    discarded_items = models.ManyToManyField('News')

因此,要获取每个用户的当前新闻列表,您只需检查该项目是否在user.discarded_items中。

答案 1 :(得分:0)

你写的内容非常好,它会起作用。但是,执行此类操作的最佳方法是定义我们的模型,例如(在您的情况下):

class UsersInCategories(models.Model):
    user = models.ForeignKey(User)
    category = models.ForeignKey(Category)

原因是您可能希望稍后添加一些其他数据,例如订阅的日期时间或其他内容。请注意,当您使用ManyToManyField时,django会在场景后面执行此操作(某些其他表应该出现在具有此类结构的数据库中,尽管我还没有测试它)。因此,如果您不需要其他数据,那就没关系。