Django:ManyToManyField创建重复的列名
我的应用程序中有两种类型的用户:Django:ManyToManyField创建重复的列名,django,django-models,Django,Django Models,我的应用程序中有两种类型的用户:auth.User,它来自django.contrib.auth(标准django身份验证模块)和mysql.User,它位于我自己的模块中。此外,mysql.User继承自一个抽象模型。整个过程与此类似(为了简洁起见,省略了一些字段): 如您所见,我想让多个auth.Users可以“拥有”一个给定的mysql.User和一个给定的mysql.Database,从而拥有多个域。但是,当我运行/manage.py syncdb时,会出现以下错误: _mysql_ex
auth.User
,它来自django.contrib.auth(标准django身份验证模块)和mysql.User
,它位于我自己的模块中。此外,mysql.User
继承自一个抽象模型。整个过程与此类似(为了简洁起见,省略了一些字段):
如您所见,我想让多个auth.Users
可以“拥有”一个给定的mysql.User
和一个给定的mysql.Database
,从而拥有多个域。但是,当我运行/manage.py syncdb
时,会出现以下错误:
_mysql_exceptions.OperationalError: (1060, "Duplicate column name 'user_id'")
实际上,/manage.py sql mysql
显示了错误的来源(同样,为了简洁起见,省略了一些列和ALTER TABLE语句):
但是我得到了这个错误:
AssertionError: ForeignKey cannot define a relation with abstract class Resource
这是对Django的期望
那么,除了将
mysql.User
重命名为类似于mysql.DBUser
的名称之外,还有什么方法可以避免Django创建的命名冲突吗?如何分别创建多对多表,避免使用manytomy字段?您可以使用管理器或方法返回给定资源的用户列表,反之亦然
class Resource(models.Model):
...
class Meta:
abstract = True
def owners(self):
return ResourceOwner.objects.filter(resource=self)
class ResourceOwners(models.Model):
resource = models.ForeignKey(Resource)
owner = models.ForeignKey(User)
class Meta:
abstract = True
如何分别创建多对多表,避免使用ManyToMany字段?您可以使用管理器或方法返回给定资源的用户列表,反之亦然
class Resource(models.Model):
...
class Meta:
abstract = True
def owners(self):
return ResourceOwner.objects.filter(resource=self)
class ResourceOwners(models.Model):
resource = models.ForeignKey(Resource)
owner = models.ForeignKey(User)
class Meta:
abstract = True
我猜您不想在用户和数据库上分别定义所有者M2M关系,并为用户-用户关系指定直通表;因此失去了抽象的优势(尽管您可以在资源上定义“所有者”属性)。另一个(疯狂的)想法是:将“通过”设置为“%(类)所有者”,并定义两个M2M模型:UserOwner和DatabaseOwner。我真的认为它不起作用,但是…我猜您不想在用户和数据库上分别定义所有者M2M关系,并为用户-用户关系指定直通表;因此失去了抽象的优势(尽管您可以在资源上定义“所有者”属性)。另一个(疯狂的)想法是:将“通过”设置为“%(类)所有者”,并定义两个M2M模型:UserOwner和DatabaseOwner。我真的不认为它有效,虽然…这是我的第一次尝试,但你不能有一个抽象模型的外键关系。换句话说,在这个提出的方法中,资源不能是抽象的。这是我的第一次尝试之一,但不能与抽象模型有外键关系。换句话说,在这种方法中,资源不能是抽象的。
AssertionError: ForeignKey cannot define a relation with abstract class Resource
class Resource(models.Model):
...
class Meta:
abstract = True
def owners(self):
return ResourceOwner.objects.filter(resource=self)
class ResourceOwners(models.Model):
resource = models.ForeignKey(Resource)
owner = models.ForeignKey(User)
class Meta:
abstract = True