Записи отношения модели Django

У меня есть данные, и я хочу организовать их как:

Я создаю три таблицы для MonthsM, Wellinfo и TestPRODM:

class MonthsM(models.Model):
    MonthsM = models.DateTimeField(unique=True)

class Wellinfo (models.Model):
    WellID    = models.CharField(max_length=15,unique=True)



class TestPRODM(models.Model):
    WellID    = models.ForeignKey(Wellinfo ,to_field='WellID', on_delete=models.CASCADE)
    TestMonth = models.ForeignKey(TestMonthM, on_delete=models.CASCADE)
    TestOIL   = models.DecimalField(max_digits=10, decimal_places=3,null=True, blank=True)

#условия В моих реальных данных есть один WellID, который можно тестировать только раз в месяц.

так как установить условие, которое делает это?

поэтому в таблице (TestPRODM) может быть много записей с одним и тем же WellID, но с разными месяцами, поэтому может быть много записей с одним и тем же TestMonth, но с разными WellID.

NB. НЕТ записей в таблице (TestPRODM) с одинаковыми WellID и TestMonth в одно и то же время.

Обновленный пост

    for i ,value in enumerate(PUITS):
        try:
            _, create = TestPRODM.objects.update_or_create(
                WellID= PUITS[i],
                TestMonth_id =obj.id,
                TestOIL =float(QHUILE[i]),
                )
            print('Saving', PUITS[i])
            AddedList +=[value]
        except:
            print('Passed', PUITS[i])
            pass

и эта функция передает все ограничения в модели и сохраняет все данные в базе данных!


person tibas    schedule 12.07.2020    source источник


Ответы (1)


Вы делаете комбинацию WellID и TestMonth уникальной с помощью UniqueConstraint [вики]:

class TestPRODM(models.Model):
    WellID = models.ForeignKey(
        Wellinfo,
        to_field='WellID',
        on_delete=models.CASCADE
    )
    TestMonth = models.ForeignKey(
        TestMonthM,
        on_delete=models.CASCADE
    )
    TestOIL = models.DecimalField(
        max_digits=10,
        decimal_places=3,
        null=True,
        blank=True
    )

    class Meta:
        constraints = [
            models.UniqueConstraint(
                fields=['WellID', 'TestMonth'],
                name='once_per_month'
            )
        ]

до django-2.2 вы можно использовать unique_together [ Джанго-док]:

class TestPRODM(models.Model):
    WellID = models.ForeignKey(
        Wellinfo,
        to_field='WellID',
        on_delete=models.CASCADE
    )
    TestMonth = models.ForeignKey(
        TestMonthM,
        on_delete=models.CASCADE
    )
    TestOIL = models.DecimalField(
        max_digits=10,
        decimal_places=3,
        null=True,
        blank=True
    )

    class Meta:
        unique_together=[['WellID', 'TestMonth']]

Примечание: обычно имена полей в модели Django записываются в snake_case, а не в PerlCase, поэтому должно быть: test_month вместо < с>TestMonth.

person Willem Van Onsem    schedule 12.07.2020
comment
Я не могу использовать UniqueConstraint. Я использую Django==2.0, и этот метод работает только до версии 2.2. - person tibas; 12.07.2020
comment
@tibas: при этом 2.0 больше не поддерживается с августа 2019 года: djangoproject.com/download - person Willem Van Onsem; 12.07.2020
comment
Спасибо, ваш метод отлично работает, когда я использую ввод форм администратором одну за другой. - person tibas; 14.07.2020
comment
@tibas: вы можете сделать TabularInline, чтобы сделать редактирование объектов в отношении m2m более удобным: docs.djangoproject.com/en/3.0/ref/contrib/admin/. - person Willem Van Onsem; 14.07.2020
comment
Я обновил свой пост. Я использую функцию в views.py для загрузки данных из листов Excel, и она загружает все данные без исключений. - person tibas; 14.07.2020