Django многие-к-одному - PullRequest
       1

Django многие-к-одному

0 голосов
/ 20 февраля 2020

Я пытаюсь создать простое приложение в Django. У меня есть некоторые проблемы, чтобы понять идею внешних ключей. Каждый проект предполагает получение нескольких квартир, и каждая квартира должна получить несколько задач.

модели:

# Project model
class Project(models.Model):
    name = models.CharField(_("Name"), max_length=30)
    city = models.CharField(_("City"), max_length=30)
    street = models.CharField(_("Street"), max_length=30)
    number = models.IntegerField(_("Number"), max_length=4)
    ZIP = models.ImageField(_("ZIP"), max_length=10)
    manager = models.CharField(_("Manager"), choices=managers, default='ariel')

    # Apartments
    apartment = models.ForeignKey(_("Apartment"), Apartment, on_delete=models.CASCADE)

    def __repr__(self):
        return "{}".format(self.name)


# Apartment model
class Apartment(models.Model):
    building = models.CharField(_("Building"), max_length=4)
    floor = models.CharField(_("Floor"), max_length=4)
    number = models.CharField(_("Number"), max_length=4)
    type = models.CharField(_("Type"), max_length=4)
    upgraded = models.BooleanField(_("Upgraded"), default=False)
    drawing = models.FileField(_("Drawing"), upload_to=None)
    notes = models.TextField(_("Notes"), max_length=500)
    status = models.BooleanField(_("Completed"), default=False)

    # Tasks
    airTunnels = models.ForeignKey(_("Air Tunnels"), Task, on_delete=models.CASCADE)
    gasPipelines = models.ForeignKey(_("Gas Pipelines"), Task, on_delete=models.CASCADE)

    def __repr__(self):
        return "{} - {}".format(self.number, self.status)

# Task model
class Task(models.Model):
    title = models.CharField(_("Task"), max_length=30)
    doneBy = models.CharField(_("Done By"), choices=workers, default='daniel')
    date = models.DateTimeField(_("Date"), default=timezone.now())

    def __repr__(self):
        return "{}".format(self.title)

1 Ответ

0 голосов
/ 20 февраля 2020

Если вы используете apartment = models.ForeignKey(_("Apartment"), Apartment, on_delete=models.CASCADE), это означает, что у каждого проекта есть только одна квартира. Таким образом, вы должны определить разные проекты для каждой квартиры. Если каждая ваша квартира может иметь только один проект, вы должны определить в своей модели квартиры иностранный ключ следующим образом:

class Apartment(models.Model):
    #...your other fields
    project = models.ForeignKey(Project, on_delete=models.CASCADE)

Для задач квартиры. Если я правильно понял, модель вашей квартиры может иметь несколько задач. Итак, вы Для этого можно использовать поле ManyToMany. С этим определением каждая ваша квартира может иметь несколько задач. Но каждая ваша задача может принадлежать нескольким объектам квартиры. Если вы не хотите, чтобы каждая задача могла принадлежать разным объектам квартиры, вы должны установить отношение OneToMany. Это можно сделать, добавив поле чужого ключа в модель задачи следующим образом:

class Task(models.Model):
    #...your other fields
    apartment = models.ForeignKey(Apartment, on_delete=models.CASCADE)
...