Аргумент int () должен быть строкой, байтовоподобным объектом или числом, а не ForeignKey - PullRequest
0 голосов
/ 09 октября 2019

Я новичок в Django.

Мне нужны столбцы, показывающие только type_of_due_date, который существует в выбранной стране.

В "классе InputType" я пытался использовать limit_choices_to и функцию Q,но видите ошибку типа

int () аргумент должен быть строкой, байтовым объектом или числом, а не 'ForeignKey' #

Пожалуйста, помогите. Что я не так сделал?

Мои модели:

class InputVatDueDate(models.Model):
    country = models.ForeignKey(Country, verbose_name='Country', on_delete=models.CASCADE, db_index=True,
                                blank=True)
    date = models.DateField(_('date'), default=datetime.datetime.now)

    class Meta:
        verbose_name = _('input vat due date')
        verbose_name_plural = _('input vats due date')
        unique_together = (('country', 'date'),)

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


class TypeOfVatDueDate(models.Model):
    vat_due_date = models.ForeignKey(InputVatDueDate, on_delete=models.CASCADE)
    type_of_due_date = models.CharField(max_length=100, choices=enum_to_choice(TypeDueDates))
    date_of_start = models.IntegerField(_('day of start date'))

    def __str__(self):
        return self.type_of_due_date

class InputType(models.Model):
    vat_due_company = models.ForeignKey(CompanyVatDueDate, on_delete=models.CASCADE)
    country = models.ForeignKey(InputVatDueDate, on_delete=models.CASCADE,)
    type_of_due_date = models.ForeignKey(TypeOfVatDueDate, on_delete=models.CASCADE, limit_choices_to=Q(vat_due_date_id=country), )

1 Ответ

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

Ваша проблема здесь:

class InputType(models.Model):
    ...
    type_of_due_date = models.ForeignKey(TypeOfVatDueDate, on_delete=models.CASCADE, limit_choices_to=Q(vat_due_date_id=country), )

Насколько я понимаю, вы хотите ограничить выбор TypeOfVatDueDate случаями, когда vat_due_date совпадает со значением country

В этом контексте переменная country является полем ForeignKey модели class , а не значением поля country текущей модели instance .

Я не знаю, как реализовать то, что вы пытаетесь достичь на уровне модели. Вам придется сделать это в другом месте, например, в пользовательской ModelForm:

class InputTypeForm(forms.ModelForm):

    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        # Restrict queryset if country is set
        if self.instance and self.instance.country:
            self.fields['type_of_due_date'].queryset = TypeOfVatDueDate.objects.filter(vat_due_date=country)

    class Meta:
        model = InputType
...