首页 > 解决方案 > 需要帮助构建具有多对多关系的 Django 数据库

问题描述

我正在为一个应用程序设置一个 Django 模型/数据库,该应用程序旨在跟踪社交媒体上keyword分配的 a的使用情况。需要为. user_ _ _messagedateurlplatformkeyword

这部分很容易用三个模型完成——一个User包含用户名、名字、姓氏、电子邮件和密码的Keyword模型,一个包含用户名作为外键的模型,以及用户关键字列表。Context然后将通过关键字链接第三个模型,并包含关键字使用的上下文信息。

所以关系看起来像:

User         Keywords         Context
username---->username
             keyword---------->Keyword
             kw_createdate     message
                               post_date
                               url
                               platform

但是,我还想RelatedTerms为每个关键字输入一个数字,例如,如果您正在跟踪关键字“python”,您可以添加相关术语“java”、“ruby”和“c#”。对于相关术语,我真正需要的是计算它们在给定时间范围内使用的次数,但我并不反对保存它们的上下文信息,因为它可能在未来有用。

我想不通的是我应该如何构建模型来存储相关术语。我应该将它们存储在Keywords模型中并有一个主要/相关标志,然后在上下文模型中也有这些词吗?

此外,关键字和上下文模型中使用的关键字之间的关系类型是什么?两个用户可以有相同的关键字,但他们将在不同的时间范围内被跟踪。

标签: sqldjangodjango-models

解决方案


另一个型号怎么样RelatedKeywords

假设相关关键字是特定于用户的,这看起来像:

class User(models.Model):
    ...

class UserKeyword(models.Model):
    user = models.ForeignKey(User, related_name='keywords')
    keyword = models.CharField(...)

class UserKewordContext(models.Model):
    user_keyword = models.OneToOneField(UserKeyword, related_name='context')  # Assumes that each UserKeyword can only have one context; change to ForeignKey if that is not the case
    keyword = models.CharField(...)
    ...

class UserRelatedKeyword(models.Model):
    user_keyword = models.ForeignKey(UserKeyword, related_name='related_keywords')
    related_keyword = models.CharField(...)

如果您有一家全球Keyword商店;将所有定义为CharFielda的关键字存储字段替换为ForeignKey

class Keyword(models.Model):
    name = models.CharField(...)

class UserKeyword(models.Model):
    user = models.ForeignKey(User, related_name='keywords')
    keyword = models.ForeignKey(Keyword)

class UserKewordContext(models.Model):
    user_keyword = models.OneToOneField(UserKeyword, related_name='context')  # Assumes that each UserKeyword can only have one context; change to ForeignKey if that is not the case
    keyword = models.ForeignKey(Keyword)
    ...

class UserRelatedKeyword(models.Model):
    user_keyword = models.ForeignKey(UserKeyword, related_name='related_keywords')
    keyword = models.ForeignKey(Keyword)

然后,您可以按如下方式访问以下内容:

  • 给定用户的所有关键字:user.keywords.all()
  • 每个的上下文UserKeyworduser_keyword.context
  • 每个的所有相关关键字UserKeyworduser_keyword.related_keywords.all()

推荐阅读