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成功运行时,您将能够通过新的预回迁相关
方法从改进的数据库优化中获益(基本上是选择与多对多字段相关的
)。