在Django模型中添加一对多关系

2024-10-08 20:26:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我的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包含所有ProjectRequest的列表。我尝试了几个不同的字段,但没有任何运气,而且文档只能找到ManyToMany和{}的字段。如何做到这一点?在


Tags: ofnameprojecttruemodelmodelsdescriptionlength
2条回答

有很多方法可以达到你想要的。为此,让我们在名为contact_requests的模型中添加一个reverse relation

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

现在您可以使用PrimaryKeyRelatedField来显示附加到每个ProjectRequest的{}的主键。在

^{pr2}$

或者,如果您想要每个contact_requests的所有值,那么您可以像这样使用nested relationship

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

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

您可以向ProjectRequest类添加一个属性函数,该函数将重新运行与该ProjectRequest相关的所有ContactRequest,如下所示。。。在

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)

相关问题 更多 >

    热门问题