Присвойте объекту то же значение поля, что и поле его внешнего ключа - PullRequest
0 голосов
/ 05 октября 2019

Резюме: у меня есть две родственные модели, и я хочу, чтобы они совместно использовали поле (zip_code):

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

Полное описание:

Я пытаюсь создать сайт доски объявлений о вакансиях,Пользователь вводит почтовый индекс, и задания в указанном радиусе должны быть возвращены. Вот мой models.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: Если у вас в голове более подходящее название, не стесняйтесь его менять, я не думаю, что четко определил проблему так хорошо.

1 Ответ

1 голос
/ 05 октября 2019

Пожалуйста, найдите пример ниже. По сути, вам нужно переписать 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)
...