Django双向manytomony-如何防止在第二个模型上创建表?

2024-04-29 12:56:20 发布

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

我有两个模型,每个模型都有一个共享的manytomyne,使用db_table字段。但是如何防止syncdb尝试为第二个模型创建共享表呢?

class Model1(models.Model):
    othermodels = ManyToManyField('Model2', db_table='model1_model2', related_name='model1_model2')

class Model2(models.model):
    othermodels = ManyToManyField('Model1', db_table='model1_model2', related_name='model2_model1')

它在我的开发环境中工作得很好,因为有些表是逐段创建的,因为我把它们都构建好了。但从一个空数据库中,syncdb抛出: _mysql_exceptions.operational错误:(1050,“表'model1_model2'已存在”)

在第二个模型的字段中是否缺少防止创建重复表的标志?还是我做的完全错了?


Tags: name模型dbmodelstableclassrelatedmodel1
3条回答

我还找到了这个解决方案,对我来说非常有效:

class Test1(models.Model):
    tests2 = models.ManyToManyField('Test2', blank=True)

class Test2(models.Model):
    tests1 = models.ManyToManyField('Test1', through=Test1.tests2.through, blank=True)

你不需要在关系的两边加上ManyToManyFieldDjango will do that for you

你可能想要这样的东西:

class Model1(models.Model):
    name = models.CharField(max_length=128)
    ...

class Model2(models.Model):
    name = models.CharField(max_length=128)
    othermodels = models.ManyToManyField(Model1, through='Model1Model2')
    ...        

class Membership(models.Model):
    class Meta:
        db_table = 'model1_model2'
    model1 = models.ForeignKey(Model1)        
    model2 = models.ForeignKey(Model2)

使用模型时,Model1的实例将有一个由django自动添加的othermodels_set字段。Model2的实例将具有othermodels

class Awesome(models.Model):
 one = models.TextField()
 class Meta:
  # Prevent table creation. 
  abstract = True

http://docs.djangoproject.com/en/dev/topics/db/models/#abstract-base-classes

这不是你要找的,但这是他们最接近的。做一个视图难道不简单吗?

也许:

class Awesome(models.Model):
  one = models.CharField(max_length = 255)
  two = models.CharField(max_length = 255)

class AwesomeOne(Awesome):
  fieldOne = models.ForeignKey(User, related_name = 'one')
  class Meta:
   abstract = True
class AwesomeTwo(Awesome):
  fieldTwo = models.ForeignKey(User, related_name = 'two')
  class Meta:
   abstract = True

然后,可以创建一个表并重写__getattr__以阻止对原始字段的访问。

相关问题 更多 >