Django 中的模型设计

Model Design in Django

我有很多组件,我希望每个组件都有一个列表,其中显示哪些用户使用了该组件以及有多少用户?

class Component(models.Model):
    name=models.CharField(max_length=128,unique=False,blank=False)
    detail=models.TextField()
    max_num=models.IntegerField(default=0)
    issued_num=models.IntegerField(default=0)

    def __str__(self):
        return self.name

    def save(self,*args,**kwargs):
        super().save(args,kwargs)

    def available(self):
        return self.max_num-self.issued_num

Status=((0,"Pending"),(1,"Accepted"),(2,"Rejected"))

class Issued(models.Model):
    request_user=models.ForeignKey(User,on_delete=models.CASCADE)
    component=models.ForeignKey(Component,on_delete=models.CASCADE)
    status=models.IntegerField(choices=Status,default=0)
    request_num=models.IntegerField(default=0)

    def __str__(self):
        return self.component.name

我想出了这个解决方案,其中根据状态发布的模型将显示为请求或将根据其状态处理发布请求的确认

任何人都可以告诉我这样做是否正确,或者它是否不建议数据库友好设计

我宁愿使 issued_num 成为模型的 属性 并使用向后关系来确定它的值。

class Component(models.Model):
    name=models.CharField(max_length=128,unique=False,blank=False)
    detail=models.TextField()
    max_num=models.IntegerField(default=0)

    def __str__(self):
        return self.name

    @property
    issued_num(self):
    # self.issue_set returns a queryset
    return self.issue_set.count()

    @property
    def available(self):
        return self.max_num - self.issued_num

    def save(self, *args, **kwargs):
    # override save method to check for issue overflows
    if self.max_num <= self.issued_num:
        raise ValidationError('max issues reached')

class Issue(models.Model):
    Status=((0,"Pending"),(1,"Accepted"),(2,"Rejected"))

    request_user=models.ForeignKey(User,on_delete=models.CASCADE)
    component=models.ForeignKey(Component,on_delete=models.CASCADE)
    status=models.IntegerField(choices=Status,default=0)
    request_num=models.IntegerField(default=0)

    def __str__(self):
        return self.component.name

这样,您无需在每次创建问题对象时都更新 issued_num 字段。这意味着减少访问数据库的次数。

您可以阅读更多关于跟随后向关系的信息here