Django Записи отношения моделей - PullRequest
1 голос
/ 12 июля 2020

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

Я создаю три таблицы, для 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 в одно и то же время.

Обновленный POST

    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

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

1 Ответ

0 голосов
/ 12 июля 2020

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

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.<b>UniqueConstraint(</b>
                fields=['WellID', 'TestMonth'],
                name='once_per_month'
            <b>)</b>
        ]

перед , вы можете использовать unique_together [Django -doc] :

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:
        <b>unique_together=[['WellID', 'TestMonth']]</b>

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

...