【问题标题】:Need help structuring a Django Database with many-to-many relationship需要帮助构建具有多对多关系的 Django 数据库
【发布时间】:2018-05-12 07:18:50
【问题描述】:

我正在为一个应用程序设置一个 Django 模型/数据库,该应用程序旨在跟踪由user 在社交媒体上分配的keyword 的使用情况。对于keyword 的每次使用,都需要存储上下文信息,例如messagedateurlplatform

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

所以关系看起来像:

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

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

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

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

【问题讨论】:

  • 相关关键字是只针对原始关键字,还是同时针对原始关键字和用户?

标签: sql django django-models


【解决方案1】:

另一个型号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 商店;将所有定义为CharField的关键字存储字段替换为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()
  • 每个UserKeyword 的上下文:user_keyword.context
  • 每个UserKeyword的所有相关关键字:user_keyword.related_keywords.all()

【讨论】:

    猜你喜欢
    • 2015-12-10
    • 1970-01-01
    • 2023-03-21
    • 2023-03-23
    • 1970-01-01
    • 2015-10-13
    • 2014-02-14
    • 2013-07-31
    • 1970-01-01
    相关资源
    最近更新 更多