Добавление отношения один ко многим в моделях Django - PullRequest
0 голосов
/ 15 апреля 2019

У меня в приложении Django-REST две модели.

ProjectRequest и ContactRequest

Я хочу сделать так, чтобы каждый Projectrequest contains a list of the refered Contactrequests.

class ProjectRequest(models.Model):
project_name = models.CharField(max_length=50)
company_name = models.CharField(max_length=50)
#make array of technologiestechnologies = models.ArrayField(base_field=) (blank=True)
project_description = models.CharField(max_length=200)
project_type = models.CharField(max_length=30)
budget_estimation = models.IntegerField(
    default=1000,
    validators=[
    MinValueValidator(1800),
    MaxValueValidator(5000000)
])
#time_estimation = models.DateTimeField(default=None, blank=True, null=True)


class ContactRequest(models.Model):
topic = models.CharField(max_length=30)
description = models.CharField(max_length=200)
time = models.CharField(max_length=15)
project_request = models.ForeignKey(ProjectRequest, 
on_delete=models.CASCADE)

До сих пор я установил отношения с внешним ключом, который на данный момент работает нормально. Однако я хочу расширить функциональность, чтобы ProjectRequest содержал список всех запросов проекта. Я попытался с несколькими различными полями, без какой-либо удачи, и в документации я могу найти только поля для ManyToMany и OneToOne. Как этого достичь?

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

Вы можете добавить функцию свойства в класс ProjectRequest, которая перезапускает все ContactRequests, которые связаны с этим ProjectRequest, вот так ...

class ProjectRequest(models.Model):
    project_name = models.CharField(max_length=50)
    company_name = models.CharField(max_length=50)
    #make array of technologiestechnologies = models.ArrayField(base_field=) (blank=True)
    project_description = models.CharField(max_length=200)
    project_type = models.CharField(max_length=30)
    budget_estimation = models.IntegerField(
        default=1000,
        validators=[
        MinValueValidator(1800),
        MaxValueValidator(5000000)
    ])
    #time_estimation = models.DateTimeField(default=None, blank=True, null=True)

    @property
    def contact_requests(self):
        return ContactRequest.objects.filter(project_request=self)


class ContactRequest(models.Model):
    topic = models.CharField(max_length=30)
    description = models.CharField(max_length=200)
    time = models.CharField(max_length=15)
    project_request = models.ForeignKey(ProjectRequest, 
    on_delete=models.CASCADE)
1 голос
/ 15 апреля 2019

Есть много способов достичь того, что вы хотите.Для этого давайте добавим обратное отношение в модель с именем contact_requests:

project_request = models.ForeignKey(ProjectRequest, on_delete=models.CASCADE, related_name="contact_requests")

Теперь вы можете использовать PrimaryKeyRelatedField , чтобы показать первичные ключи ContactRequestприкрепленный к каждому ProjectRequest.

class ProjectRequestSerializer(serializers.ModelSerializer):
    contact_requests = serializers.PrimaryKeyRelatedField(many=True, read_only=True)

    class Meta:
        model = ProjectRequest
        fields = ('contact_requests', 'company_name', ...)  # other fields 

Или, если вы хотите, чтобы все значения каждого contact_requests, то вы можете использовать вложенные отношения , например:

class ProjectRequestSerializer(serializers.ModelSerializer):
    contact_requests = ContactRequestSerializer(many=True, read_only=True)

    class Meta:
        model = ProjectRequest
        fields = ('contact_requests', 'company_name', ...) # and so on
...