Django Foreignkey с полями редактирования и выберите поле, как положить в форму - PullRequest
0 голосов
/ 01 февраля 2020

Я прошу прощения, если этот вопрос был поднят раньше. Но я боролся с этим в течение нескольких недель и не смог найти ничего полезного.

У меня есть следующая проблема (она сильно упрощена, но по сути моя проблема представлена)

У меня есть Модель, которая имеет много полей. Он называется

class DocAide(models.Model):
    id = models.AutoField(primary_key=True)
    pulse = models.DecimalField('Pulse', max_digits=3, decimal_places=0)
    weight = models.DecimalField('Weight (kg)', max_digits=3, decimal_places=0)
    bp_sys = models.DecimalField('BP Sys', max_digits=3, decimal_places=0)
    bp_dia = models.DecimalField('BP Dia', max_digits=3, decimal_places=0)
    temperature = models.DecimalField('Temp. deg C', max_digits=2, decimal_places=1)
    drugs = models.ManyToManyField(Drug, blank=True)    
    date = models.DateField(editable=False, default=timezone.now)
    doctors_notes = models.TextField('Patient is complaining about:', default='')
    note = models.TextField(max_length=100, default='')

ForeignKey Drugs имеет названия лекарств с количеством, которое я хотел бы иметь возможность выбрать несколько лекарств, но с полями редактирования, которые показывают, какую дозировку необходимо принять, и когда, это должно быть похоже на рецепт. Модель выглядит следующим образом:

class Drug(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100, default='')
    QUANTITY_STR = ['Bottle', 'Tablet' 'Injection', 'Capsules', 'other']
    QUANTITY = ((str, str) for str in QUANTITY_STR)
    quantity = models.CharField(max_length=2, choices=QUANTITY, default='Bottle')
    category = models.CharField(max_length=150, default='')
    strength = models.CharField(max_length=150, default='')
    in_supply_stock = models.PositiveIntegerField(default=0)
    in_main_stock = models.PositiveIntegerField(default=0)
    date = models.DateField(editable=False, default=timezone.now)
    charge = models.PositiveIntegerField(default=0)
    morning = models.CharField(validators=[int_list_validator], max_length=3, default=0)
    midday = models.CharField(validators=[int_list_validator], max_length=3, default=0)
    evening = models.CharField(validators=[int_list_validator], max_length=3, default=0)
    night = models.CharField(validators=[int_list_validator], max_length=3, default=0)
    days = models.CharField(validators=[int_list_validator], max_length=3, default=0)
    tablets = models.CharField(validators=[int_list_validator], max_length=3, default=0)

Как мне выполнить sh в форме или шаблоне. Я пытался с Inlineformset, это не работает. Также позже я бы хотел, чтобы они были предварительно отобраны.

Но сейчас мне нужна кнопка, которая выдает строку с выпадающим списком лекарств и полями редактирования модели.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

Как уже говорили другие, объект Drug не должен иметь количество, связанное с ним, но должна быть прописана "запись".

Я думаю, что это структура модели, которая вам нужна:

QUANTITY_STR = ['Bottle', 'Tablet' 'Injection', 'Capsules', 'other']

class DocAide(models.Model):
    # same properties but remove `drugs` from this model


class Drug(models.Model):
    # same properties but remove `quantity` property


class Prescription(model.Model):
    drug = model.ForeignKey(to=Drug, related_name='prescriptions')
    doc_aide = model.ForeignKey(to=DocAide, related_name='prescriptions')
    quantity = models.IntegerField()
    qty_container = models.CharField(max_length=10, choices=QUANTITY_STR, default=QUANTITY_STR[0])

Я изменил несколько вещей для вас, предполагая, что я правильно понял логику вашего бизнеса c. Например, как работает поле quantity.

Я создал два поля для описания количества. quantity содержит числовое значение, а qty_container содержит имя контейнера, если хотите, например, "Bottle", "Впрыск" и т. Д.

qty_container имеет max_length, равное количество символов в слове «Инъекция», так как это самое большое слово, которое может поместиться в этом поле. default этого поля было больше, чем max_length, что могло вызвать ошибку.

Теперь я не уверен, почему вы хотели сохранить кортеж из двух строк в поле количества, поэтому я проигнорировал это, но если вы можете прокомментировать предполагаемую логику c, здесь я мог бы отредактировать ответ.

В любом случае, модель Prescription.

Эта модель будет действовать как посредник между Drug и DocAide, и именно он будет хранить информацию о количестве. Я связал его с Drug и DocAide, используя внешние ключи, и установил для related_name подходящие имена. Эти "related_names", которые вы найдете, появятся в указанной модели. Так, например, если вы можете сделать

doc_aide = DocAide.objects.get(pk=1)
for presc in doc_aide.prescriptions:
    print(presc.drug.name)
    print(presc.quantity)

Это означает, что один DocAide объект будет связан с одним или несколькими Prescription объектами, каждый из которых содержит quantity информацию и связан с Drug object:

DocAide (id, etc) >> Prescription (doc_aide_id, drug_id, qty_info) >> Drug (id, etc) 

В качестве примечания: после того, как вы убедитесь, что все работает и у вас все хорошо для go, вам может понадобиться изучить оптимизацию запросов в Django, потому что, как это написано сейчас, это довольно неоптимизировано. Но не беспокойтесь об оптимизации, пока вы не закончили и ваш код работает правильно.

1 голос
/ 06 февраля 2020

Возможно, вы захотите переместить некоторые поля вашей Drug модели в промежуточное поле, которое определяет внешний ключ для ваших Drug и DocAide моделей .

Это Затем модель должна использоваться как опция through вашего DocAide.drugs поля .

Если вы используете администратора, вы сможете полагаться на inlines для отображения формы ввода, позволяющей выбрать желаемый Drug и аннотировать дополнительные поля, в противном случае вам, вероятно, придется создать собственный механизм, который опирается на ModelFormSet.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...