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

sam*_*ome 14 python django many-to-many

我有两个模型,每个模型都有一个共享的ManyToMany,使用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')
Run Code Online (Sandbox Code Playgroud)

它在我的开发环境中工作得很好,因为有些表是零碎地创建的,因为我将它全部构建出来.但是从空数据库中,syncdb抛出:_mysql_exceptions.OperationalError:(1050,"表'model1_model2'已存在")

我是否在第二个模型的字段中缺少一个标志以防止重复创建表?或者我只是这样做完全错了?

Lap*_*anc 21

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

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

class Test2(models.Model):
    tests1 = models.ManyToManyField('Test1', through=Test1.tests2.through, blank=True)
Run Code Online (Sandbox Code Playgroud)


Set*_*eth 5

你不需要ManyToManyField在关系的两边放置一个.Django会为你做到这一点.

你可能想要更像这样的东西:

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)
Run Code Online (Sandbox Code Playgroud)

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


jbc*_*tin 2

class Awesome(models.Model):
 one = models.TextField()
 class Meta:
  # Prevent table creation. 
  abstract = True
Run Code Online (Sandbox Code Playgroud)

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

这不是你要找的,但这是我相信的最接近的。做个view不是更简单吗?

或许:

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
Run Code Online (Sandbox Code Playgroud)

然后,您可以创建一张表并覆盖该表__getattr__以阻止对原始字段的访问。