Python 如何用django';s型?

Python 如何用django';s型?,python,database,django,Python,Database,Django,用户表: -------------------- | id | name | age | -------------------- | | | | -------------------- 型号: class User(models.Model): name = models.CharField(max_length=30) age = models.SmallIntegerField() 宠物桌: -------

用户表:

   --------------------
   | id | name | age |
   --------------------
   |    |      |     |
   --------------------
型号:

class User(models.Model):
    name = models.CharField(max_length=30)
    age = models.SmallIntegerField()
宠物桌:

   --------------------
   | id | name | intro |
   --------------------
   |    |      |       |
   --------------------
型号:

class Pet(models.Model):  
    species = models.CharField(max_length=30)
    intro = models.TextField()  
现在我想描述一下这种关系:
一个用户可以有几个宠物(具有独特的物种),我想存储用户得到宠物的时间。在数据库中应该是这样的:

   --------------------------------
   | id | user_id | pet_id | since |
   --------------------------------
   |    |         |        |       |
   --------------------------------
但我不知道如何用django的模型来描述它…

试试这个:

class UsersPet(models.Model):
    pet = models.ForeignKey(Pet)
    user = models.ForeignKey(User) 
    since = models.DateTime()
您使用“贯穿”模型。基本上,您可以定义自己的中间表,而不是让Django自动执行:

class User(models.Model):
    ...
    pets = models.ManyToManyField(Pet, through='UserPet')

class UserPet(models.Model):
    user = models.ForeignKey(User)
    pet = models.ForeignKey(Pet)
    since = models.DateTimeField(auto_now_add=True)

用户中的这一行是必要的吗?必要的部分是通过class='UserPet'定义多对多关系的地方。如果它在
Pet
上,你可以很容易地做
users=models.ManyToManyField(User,through='UserPet')
我的意思是,如果没有pets=models.ManyToManyField(Pet,through='UserPet'),这也应该行得通。这是真的吗?你可以直接访问
UserPet
模型,是的,但这不是一个好的形式。建立M2M关系会为您带来很多其他方面可能会丢失的实用程序,当Django 1.4成功运行时,您将能够通过新的
预回迁相关
方法从改进的数据库优化中获益(基本上是
选择与多对多字段相关的
)。