Как сделать запрос, соединив модель Django с другой в неуникальном столбце? - PullRequest
0 голосов
/ 17 июня 2019

У меня есть следующие модели в моем файле models.py в моем проекте django

from django.contrib.auth.models import AbstractUser
from django.db import models
from django.conf import settings

class CustomUser(AbstractUser):
    pass
    # add additional fields in here

class PDFForm(models.Model):

    pdf_type=models.IntegerField(default=0)
    pdf_name=models.CharField(max_length=100,default='')
    file_path=models.FileField(default='')  

class FormField(models.Model):

    fk_pdf_id=models.ForeignKey('PDFForm', on_delete=models.CASCADE,default=0)
    field_type=models.IntegerField(default=0)
    field_page_number=models.IntegerField(default=0)
    field_x=models.DecimalField(max_digits=6,decimal_places=2,default=0)
    field_y=models.DecimalField(max_digits=6,decimal_places=2,default=0)
    field_x_increment=models.DecimalField(max_digits=6,decimal_places=2,default=0)
    class Meta:
        ordering= ("field_page_number", "field_type")

class UserData(models.Model):

    fk_user_id=models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE,default=0)
    field_type=models.IntegerField(default=0)
    field_text=models.CharField(max_length=200,default='')
    field_date=models.DateField()

Вот как связаны модели

1) PDF-форма содержит PDF-форму и путьдля него в файловой системе

2) PDF-форма содержит несколько полей FormFields.Каждое поле имеет атрибуты, а конкретное обсуждаемое поле - field_type

3) Модель UserData содержит данные пользователя, поэтому один пользователь может иметь несколько строк в этой таблице.Эта модель также имеет столбец field_type.

То, что я пытаюсь сделать запрос, - это найти все строки, присутствующие в модели пользовательских данных, которые присутствуют в модели FormField (соответствует field_type) и которые имеют определенную PDFForm.

Учитываячто отношение «многие ко многим» в моделях django не может иметь место между никакими уникальными полями, как можно было бы сделать запрос, подобный приведенному нижене хватает как django создает соединения.Как можно сделать вышеупомянутый SQL-оператор, чтобы я получил необходимый набор данных?

1 Ответ

2 голосов
/ 17 июня 2019

Я думаю, что в UserData отсутствует отношение к FormField, но если бы у вас было это отношение, вы могли бы сделать:

  UserData.objects.filter(
    fk_user_id=1, # Rename this to user, Django wilt automicly create a user_id column
    form_field__in=FormField.objects.filter(
      fk_pdf_id=<your pdfid>  # same as fk_user_id 
    )
  )

Редактировать обновленные модели

Когда вы используете ForeignKey, вам не нужно указывать _id или default = 0, если вы не всегда хотите заполнять поле, лучше установить null=True и blank=True

from django.contrib.auth.models import AbstractUser
from django.db import models
from django.conf import settings

class CustomUser(AbstractUser):
    pass
    # add additional fields in here

class FieldTypeMixin:
    TYPE_TEXT = 10
    TYPE_DATE = 20

    TYPE_CHOISES = [
        (TYPE_TEXT, 'Text'),
        (TYPE_DATE, 'Date'),
    ]

    field_type=models.IntegerField(default=TYPE_TEXT, choises=TYPE_CHOISES)

class PDFForm(models.Model):
    pdf_type = models.IntegerField(default=0)
    pdf_name = models.CharField(max_length=100,default='')
    file_path = models.FileField(default='')  

class FormField(models.Model, FieldTypeMixin):
    pdf_form = models.ForeignKey('PDFForm', on_delete=models.CASCADE)
    field_page_number = models.IntegerField(default=0)
    field_x = models.DecimalField(max_digits=6,decimal_places=2,default=0)
    field_y = models.DecimalField(max_digits=6,decimal_places=2,default=0)
    field_x_increment = models.DecimalField(max_digits=6,decimal_places=2,default=0)

    class Meta:
        ordering = ("field_page_number", "field_type")

class SubmittedForm(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, models.CASCADE)
    pdf_form = models.ForeignKey(PDFForm, models.CASCADE)

class SubmittedFormField(models.Model, FieldTypeMixin):
    submitted_form = models.ForeignKey(SubmittedForm, models.CASCADE)
    form_field = models.ForeignKey(FormField, models.CASCADE, related_name='fields')

    field_text = models.CharField(max_length=200,default='')
    field_date = models.DateField()

    class Meta:
        unique_together = [
            ['submitted_form', 'form_field']
        ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...