gpt4 book ai didi

python - 通过中介模型在 django 中创建与 AUTH_USER_MODEL 的多对多关系

转载 作者:太空宇宙 更新时间:2023-11-03 17:47:50 25 4
gpt4 key购买 nike

我正在尝试创建以下模型。通过 EntryLike 中间模型,从 EntryAUTH_USER_MODEL 存在一个 ManyToMany 关系。

class BaseType(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
creation_time = models.DateTimeField(auto_now_add=True)
last_update_time = models.DateTimeField(auto_now=True)
class Meta:
abstract = True


class Title(BaseType):
text = models.CharField(max_length=100)
description = models.TextField()

class EntryLike(BaseType):
entry = models.ForeignKey(Entry)
user = models.ForeignKey(settings.AUTH_USER_MODEL)

class Entry(BaseType):
title = models.ForeignKey(Title, on_delete=models.PROTECT)
text = models.TextField()
user = models.ForeignKey(settings.AUTH_USER_MODEL)
liked_by_users = models.ManyToManyField(settings.AUTH_USER_MODEL, through='EntryLike', through_fields=('entry', 'user'))

在上述模型方案上运行迁移会引发错误:AttributeError:'str' object has no attribute 'meta'

任何解决此错误的帮助都将受到高度赞赏。我是 Django 和 Python 新手,但不是 Web 开发新手。

最佳答案

问题是 settings.AUTH_USER_MODEL 几乎肯定不是模型实例。它可能是一个限制另一个模型可以做出的选择的字符串 - 设置将是一个留下模型定义的奇怪地方。

要在用户模型和上面的字段之间执行 MTM,您需要执行以下操作:

from django.contrib.auth.models import User
class Entry(BaseType):
title = models.ForeignKey(Title, on_delete=models.PROTECT)
text = models.TextField()
user = models.ForeignKey(User)
def __str__(self):
return self.title

我添加了 str 函数,以便当您在 admin/shell 中操作它时它会给出更合理的返回。

我还想知道您是否需要第二组字段(此处已删除),因为您可以使用 select related在 Entry 和 EntryLike 连接表之间,没有任何字段重复 - 您可能可以这样做,只是有点不必要。

最后,我要注意的是,我上面使用它的方式只是使用 Django 附带的默认 User 对象 - you may wish to customise it.或者像您在此处使用自己的模型的基类所做的那样扩展基类。

(所有这一切都基于 AUTH_USER_MODEL 不是模型实例 - 如果是,您可以从 settings.py 发布模型定义吗?)

关于python - 通过中介模型在 django 中创建与 AUTH_USER_MODEL 的多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29531996/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com