通过中介mod在Django中使用AUTH_USER_模型创建多对多关系

2024-06-24 13:40:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建以下模型。通过EntryLike中间模型,存在Entry到{}的{}关系。在

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开发。在


Tags: 模型authtruemodelsettingstimemodelsclass
1条回答
网友
1楼 · 发布于 2024-06-24 13:40:19

问题是settings.AUTH_用户模型几乎肯定不是一个模型实例。它可能是一个字符串,它约束了另一个模型可以做出的选择—设置是离开模型定义的一个奇怪的地方。在

要在用户模型和上述字段之间执行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中操作它时,它会给出更合理的返回。在

我还想问您是否需要第二组字段(此处已删除),因为您可以在Entry和EntryLike join表之间使用select related,而不必重复字段—您可以这样做,只是有点不必要。在

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

(所有这些都是基于AUTH_USER_MODEL不是一个模型实例-如果是的话,您可以从设置.py?) 在

相关问题 更多 >