赋予对象与其外键字段相同的字段值

问题描述 投票:0回答:1

摘要:我有两个相关的模型,希望它们共享一个字段(邮政编码):

class Business(models.Model):
    #other fields
    zip_code = models.CharField(max_length = 10)
 class Job(models.Model):
    business = models.ForeignKey(Business, on_delete = "models.CASCADE") 
    zip_code = business.zip_code #Does not work

完整说明:

我正在尝试创建工作委员会网站。用户输入邮政编码,应返回指定半径的作业。这是我的模型。py:

class Business(models.Model):
    name = models.CharField(max_length = 150)
    address = models.CharField(max_length = 150)
    city = models.CharField(max_length = 150)
    zip_code = models.CharField(max_length = 10)
    state = models.CharField(max_length = 30)
    phone_number = models.CharField(max_length = 10)

    def __str__(self):
        return self.name +", " + self.address + ", " + self.state

class Job(models.Model):
    business = models.ForeignKey(Business, on_delete = "models.CASCADE")
    title = models.CharField(max_length = 100)
    description = models.CharField(max_length = 500)
    zip_code = business.zip_code

    def __str__(self):
        return self.title + " - " + self.business.name

[尝试通过邮政编码过滤Job对象:

jobs_in_zip = Job.objects.all().filter(zip_code = zip_code)

我意识到Job模型没有zip_code字段。我尝试这样更新模型:

class Job(models.Model):
    business = models.ForeignKey(Business, on_delete = "models.CASCADE")
    zip_code = business.zip_code

但是返回了AttributeError: 'ForeignKey' object has no attribute 'zip_code'

我应该如何处理?提前致谢。

PS:如果您脑子里有个更好的标题,请随时进行更改,但我认为我没有明确地定义问题。

django django-models
1个回答
1
投票

请在下面找到示例。本质上,您需要覆盖save类的Job方法:

class Algorithm(models.Model):
    name = models.CharField(max_length=120, unique=True)

class JobLog(models.Model):
    task_id = models.CharField(max_length=120, unique=True, primary_key=True)
    task_name = models.CharField(max_length=120, null=True)
    algorithm = models.ForeignKey(Algorithm, on_delete=models.CASCADE)

    def save(self, *args, **kwargs):
        self.task_name = self.algorithm.name + "-" + self.task_id
        super(JobLog, self).save(*args, **kwargs)

出于您的目的:

class Job(models.Model):
    business = models.ForeignKey(Business, on_delete = "models.CASCADE")
    title = models.CharField(max_length = 100)
    description = models.CharField(max_length = 500)
    zip_code = business.zip_code

    def __str__(self):
        return self.title + " - " + self.business.name

    def save(self, *args, **kwargs):
        self.zip_code = self.business.zip_code
        super(Job, self).save(*args, **kwargs)
© www.soinside.com 2019 - 2024. All rights reserved.