我正在尝试创建以下模型。通过ManyToMany
中间模型,Entry
与AUTH_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开发。
答案 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发布模型定义吗?)