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

时间:2015-04-09 07:08:29

标签: python django django-models

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

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& amp;的新手Python,但不是Web开发。

1 个答案:

答案 0 :(得分:1)

问题是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中操作它时,它会给出更明智的回报。

我还会质疑你是否需要第二组字段(在这里删除),因为你可以在Entry和EntryLike连接表之间使用select related,而不需要重复字段 - 你可以去那里方式,它只是有点不必要。

最后,我注意到我上面使用它的方式只使用Django附带的默认User对象 - you may wish to customise it.或扩展基类,就像你在这里使用自己的模型一样'基类。

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