Не уверен, что понимаю зависимость между 2 django моделями - PullRequest
0 голосов
/ 18 апреля 2020

Я изо всех сил пытаюсь понять django модель отношений.

У меня есть это древовидность:

У поезда есть вагоны, и эти вагоны делятся на части. Тогда все эти части содержат разные ссылки. Как, например, все поезда имеют 6 вагонов, а вагоны - 6 частей. Каждая часть имеет ссылку x, которая должна быть связана.

Я хотел бы использовать их все позже в шаблоне, где пользователь может выбрать поезд, вагон и часть, над которой он работал, а затем сгенерировать таблицу из его выбора только с ссылками, связанными с частями, которые он выбрал. Это должно обновить поезд и вагон (я пытаюсь обновить запас элементов для компании)

Я действительно не понимаю, какое поле модели дает каждому из них. После проверки do c я сделал что-то подобное, но я не уверен:

class Train(Car):
    train = models.CharField(max_length=200)
    id = models.CharField(primary_key='True', max_length=100)
    selected = models.BooleanField()

    class Meta:
        abstract = True


class Car(Part):
    car = models.CharField(max_length=200)
    id = models.CharField(primary_key='True', max_length=100)
    selected = models.BooleanField()

    class Meta:
        abstract = True


class Part(Reference):
    part = models.CharField(max_length=200)
    id = models.CharField(primary_key='True', max_length=100)
    selected = models.BooleanField()

    class Meta:
        abstract = True


class Reference(models.Model):
    reference = models.CharField(max_length=200)
    id = models.CharField(primary_key='True', max_length=100)
    selected = models.BooleanField()

    def __str__(self):
        return self.reference

Может ли кто-нибудь помочь мне понять это, чтобы я мог справиться? Спасибо !!

1 Ответ

0 голосов
/ 18 апреля 2020

1-) если вы добавите abstract = True в свой класс модели Meta, ваш класс не будет создан в базе данных как таблица. Если вы храните данные для любого класса, вы не должны определять abstract = True.

2-) Для отношений вы можете использовать models.ForeignKey. Если вы добавляете класс в скобки другого класса, он называет: наследование (вы можете думать как отношения родитель-потомок). В управлении базой данных мы можем использовать иностранный ключ для отношения один-ко-многим.

3-) В Django ORM поле идентификатора генерируется автоматически. Поэтому вам не нужно определять поле идентификатора.

Если я правильно понимаю, вы также хотите сохранить части выбранного пользователя.

Итак, ваша модель может быть такой:

class Train(models.Model):
    name = models.CharField(max_length=200) # I think you want to save name of train

class Car(models.Model):
    train = models.ForeignKey(Train,on_delete=models.Cascade)
    name = models.CharField(max_length=200)

class Part(models.Model):
    car = models.ForeignKey(Car,on_delete=models.Cascade)
    name = models.CharField(max_length=200)


class Reference(models.Model):
    part = models.ForeignKey(Part,on_delete=models.Cascade)
    name = models.CharField(max_length=200)

    def __str__(self):
        return self.reference

#addtional table for storing user's references
 class UserReference(models.Model):
    user = models.ForeignKey(User,on_delete=models.Cascade)
    reference = models.ForeignKey(Reference,on_delete=models.Cascade)
    name = models.CharField(max_length=200)

С помощью этих определений вы можете сохранить определение пользователя в таблице UserReference. А с Django Orm вы можете получить доступ к объекту поезда из UserReferenceObject.

#user_reference: UserReference object like that result of UserReference.objects.first()
user_reference.reference.part.car.train.name
...