Django 如何使用从一个模型到另一个模型的多个字段作为外键?

Django 如何使用从一个模型到另一个模型的多个字段作为外键?,django,model,Django,Model,我试图使用我的狗模型中的多个字段作为我的狗模型中的选项。当我创建一个新的MyDog实例时,它同时显示Dog.name中的内容。我怎样才能使我的狗。繁殖看到什么在狗。繁殖 class Dog(models.Model): name = models.CharField(max_length=10) breed = models.CharField(max_length=10,unique=True) def __str__(self): return self.name class My

我试图使用我的狗模型中的多个字段作为我的狗模型中的选项。当我创建一个新的MyDog实例时,它同时显示Dog.name中的内容。我怎样才能使我的狗。繁殖看到什么在狗。繁殖

class Dog(models.Model):
name = models.CharField(max_length=10)
breed = models.CharField(max_length=10,unique=True)
def __str__(self):
    return self.name

class MyDog(models.Model):   
    name=models.ForeignKey(Dog,related_name='mydogname',on_delete=models.CASCADE)
    breed = models.ForeignKey(Dog,related_name='mydogbreed',on_delete=models.CASCADE,to_field='breed',db_column='breed')

“是什么”表明有你定义的东西

def __str__(self):
    return self.name
这大致可以翻译为“狗实例的字符串表示”。我不认为您可以根据它们所使用的ForeignKey字段进行更改,但它不应该对功能有任何影响,只应该对它的显示方式有影响。如果需要,您可以这样打印品种:

my_dog = MyDog.objects.get(...)
print my_dog.breed # this prints what __str__ method prints for dog
print my_dog.breed.breed # this prints breed field of dog

外键关系不是这样运作的。建立关系时,是与对象(另一个表)建立关系,而不是与该表的特定列建立关系

因此,如果
myDog=myDog(name=Dog.objects.first())
在数据库中创建与第一只
Dog
相关的
myDog
对象,那么
myDog.name.name
将为您提供
Dog
name
字段,而
myDog.name.bride
将为您提供品种。正如您所看到的,您的模型没有以这种方式很好地定义

更符合逻辑的结构是:

 class Breed(models.Model):
     name = models.CharField(...)

     def __str__(self):
         return self.name

 class Dog(models.Model):
     name = models.CharField(...)

 class MyDog(models.Model):
     dog = models.ForeignKey(Dog)
     breed = models.ForeignKey(Breed)

 dog = Dog.objects.create(name='Pluto')
 breed = Breed.objects.create(name='Collie')
 my_dog = MyDog(dog=dog, breed=breed)
 my_dog.breed.name  # "Collie"
 print(my_dog.breed)  # "Collie" because of __str__()

如果您有类Dog,则不需要创建另一个类MyDog,只需使用primary_键定义dogs即可。此
dog=models.ForeignKey(dog,related\u name='mydogname',on\u delete=models.CASCADE)
现在对任何主键使用“dog.name”和“dog.bride”\u只需获取my dog实例即可。@NVS谢谢NVS!你帮我理解了。谢谢!你说得对,你说的第一句话是我过去是怎么理解的,谢谢你的启发。