#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. Вы помогли мне понять. Большое спасибо!