Все,путать о Джанго ForeignKey, ManyToManyField, inlineformset_factories
Я что-то фундаментальное о базовой модели для ForeingKeys Джанго против ManyToManyFields отсутствует.
Предположим, я создаю заявку на автомобили. Я мог бы иметь следующие классы:
class Car(models.Model):
carName = models.CharField()
class Manufacturer(models.Model):
manufacturerName = models.CharField()
class Wheel(models.Model):
radius = models.IntegerField()
Пока все хорошо. Теперь между этими классами существуют некоторые отношения. Автомобиль имеет производителя и имеет (четыре) шины. Понятно, что есть разница. Изготовитель связан посредством «агрегации»; производитель может быть связан с несколькими автомобилями; удаление экземпляра Car не должно приводить к удалению производителя автомобиля. Колеса связаны посредством «композиции»; каждые четыре колеса, связанные с автомобилем, связаны с этим и только с этим автомобилем; удалите автомобиль, и колеса также должны быть удалены.
Таким образом, интуитивно, что означает, что я должен сделать следующее:
class Car(models.Model):
carName = models.CharField()
manufacturer = models.ManyToManyField("Manufacturer")
wheels = models.ForeignKey("Wheel")
В конце концов, я хочу использовать inlineformset_factories, так что пользователи могут заполнить подробную информацию о машине, его производитель и колеса все на в то же время. Что-то вроде этого:
class CarForm(ModelForm):
class Meta:
model = Car
class ManufacturerForm(ModelForm):
class Meta:
model = Manufacturer
class WheelForm(ModelForm):
class Meta:
model = Wheel
Manufacturer_formset = inlineformset_factory(Car,Manufacturer,formset=ManufacturerForm)
Wheel_formset = inlineformset_factory(Car,Wheel,formset=WheelForm)
Но большая часть документации, которую я нахожу, предполагает, что ForiegnKey должна идти от колеса к автомобилю. Это кажется мне обратным, поскольку Wheel_formset затем предоставил пользователю все поля для автомобиля («carName»), а не «Wheel» («радиус»).
Просто поступок ввода этого вопроса меня смущает. Кто-нибудь может пролить свет на то, как я могу создать форму, в которой есть все поля для автомобилей, а затем все поля изготовителя, а затем все поля колес.
Благодаря
Благодарим за этот ответ.Могу ли я подтвердить, что если у автомобиля может быть более одного производителя (скажем, оно построено командой), то я должен использовать ManyToManyField? – trubliphone
Да, если автомобиль может иметь более одного производителя (и производитель может построить больше, чем один автомобиль), используйте «ManyToManyField». – Alasdair
Бит опоздал на вечеринку, но не был бы иностранным ключом для многих отношений? –