Как использовать несколько полей из одной модели в другую в качестве внешнего ключа?

#django #model

#django #Модель

Вопрос:

Я пытаюсь использовать несколько полей из моей модели 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')
  

Комментарии:

1. Если у вас есть класс Dog, вам не нужно создавать другой класс myDog, просто используйте primary_key для определения dogs. решение для этого dog = models.ForeignKey(Dog,related_name='mydogname',on_delete=models.CASCADE) теперь используйте «dog.name » и «dog.breed» для любого primary_key просто извлеките экземпляр my dog.

2. @NVS Спасибо, NVS!

Ответ №1:

Отношения 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__()
  

Комментарии:

1. Вы правы, первое предложение, которое вы сказали, было о том, как я раньше это понимал, спасибо, что просветили меня.

Ответ №2:

Что показывает, что есть то, что вы определяете с

 def __str__(self):
    return self.name
  

что примерно переводится как «Строковое представление экземпляра Dog». Я не думаю, что вы можете меняться в зависимости от поля ForeignKey, в котором они используются, но это не должно оказывать никакого влияния на функциональность, только на то, как это отображается. Вы можете напечатать breed следующим образом, если хотите:

 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
  

Комментарии:

1. Вы помогли мне понять. Большое спасибо!