2016-10-14 2 views
1

Я хотел бы добавить поле в базу данных только для чтения. Итак, я хотел бы создать фиктивную базу данных формы;Объединить поля модели

class ReadOnly(models.Model): 
    first = models.CharField(db_column='First') 
    second = models.CharField(db_column='Second') 

class ExtraStuff(models.Model): 
    first = models.CharField(db_column='First') 
    second = models.CharField(db_column='Second') 
    combined = first+second 

Я использовал @property, но так как я не могу комбинировать свойства и фильтры я чувствую, что это лучшее решение. Тем не менее, у меня нет идей о том, как добиться этого.

ответ

2

Вы пытаетесь получить сборщик для комбинирования?

class ExtraStuff(models.Model): 
    first = models.CharField(db_column='First') 
    second = models.CharField(db_column='Second') 

    @property 
    def combined(self): 
     return self.first + self.second 
+0

Проблема с этим и решением, опубликованным Daniel van Flymen, заключается в том, что я не могу использовать это значение в фильтре. Когда я пытаюсь это сделать, возвращается FieldError. – user2019553

0

Я не 100% уверен, что вы имеете в виду, но если вы просто хотите, чтобы получить комбинированные поля:

class ExtraStuff(models.Model): 
    first = models.CharField(db_column='First') 
    second = models.CharField(db_column='Second') 

@property 
def combined(self) 
    return self.first + self.second 

Затем, когда у вас есть модель, вы можете обращаться в сочетании как Read- только поле:

my_model = ExtraStruff.objects.get(pk=1) 
my_model.combined 
0

Предлагаю использовать annotate() and concat(), а затем фильтр().

ReadOnly.objects.annotate(combined=Concat('first', 'second', output_field=CharField())).filter(combined='abc123') 

Вы можете добавить пользовательский менеджер для вашей ReadOnly модели, чтобы избежать повторения кода

class ReadOnlyManager(models.Manager): 
    def get_queryset(self): 
     return super(ReadOnlyManager, self).get_queryset().annotate(combined=Concat('first', 'second', output_field=CharField())) 

class ReadOnly(models.Model): 
    first = models.CharField(db_column='First') 
    second = models.CharField(db_column='Second') 
    objects = models.Manager() 
    combined_objects = ReadOnlyManager() 

Затем вы можете использовать следующие в любом месте вашего кода.

ReadOnly.combined_objects.filter(combined='abc123') 
Смежные вопросы