Как использовать несколько полей из одной модели в другую как чужой ключ? - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь использовать несколько полей из моей модели Dog в качестве выбора в модели MyDog. Когда я создаю новый экземпляр MyDog, он показывает, что находится в Dog.name. Как я могу сделать так, чтобы MyDog.breed увидел что в Dog.breed?

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')

Ответы [ 2 ]

1 голос
/ 13 марта 2019

Это не так, как работают отношения ForeignKey.Когда вы устанавливаете связь, вы устанавливаете связь с объектом (другой таблицей), а не с конкретным столбцом этой таблицы.

Таким образом, если myDog = MyDog(name=Dog.objects.first()) создаст объект MyDog, относящийся к первому Dog в базе данных, то myDog.name.name даст вам поле name полей Dog и myDog.name.breedдать вам породу.Как видите, ваши модели не очень хорошо определены таким образом.

Более логичная структура была бы:

 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__()
0 голосов
/ 13 марта 2019

То, что показывает, есть то, что вы определяете с помощью

def __str__(self):
    return self.name

, что примерно соответствует «Строковому представлению экземпляра Dog».Я не думаю, что вы можете изменить в зависимости от поля 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...