Я пишу научное веб-приложение в Джанго, посвященное аминокислотным последовательностям фрагментов Fab антител, каждый из которых состоит ровно из одной тяжелой цепи и одной легкой цепи.Каждая из этих цепей состоит из последовательности аминокислотных остатков.
My models.py
по сути это:
from django.db.models import *
class Fab(Model):
name = CharField(max_length=30)
...
def __unicode__(self):
return self.name
class Chain(Model):
fab = ForeignKey(Fab)
TYPE_CHOICES = (
('L', 'light'),
('H', 'heavy'),
)
type = CharField(max_length=5)
...
class Residue(Model):
ch = ForeignKey(Chain)
...
Таким образом, в процессе ввода Fab в базу данных я создаю 2 цепочки, присваиваю каждому type
и fab
внешний ключ.Затем, чтобы использовать их в шаблоне, я использую следующее представление, получая каждую цепочку как объект и передавая ее в шаблон независимо от родительского объекта Fab, что не совсем идеально.
def fab_detail(request, fab_id):
f = get_object_or_404(Fab, pk=fab_id)
h = get_object_or_404(Chain, fab=f, type='H')
l = get_object_or_404(Chain, fab=f, type='L')
return render_to_response('antibodies/fab_detail.html', {
'fab': f,
'light': l,
'heavy': h,
}, context_instance=RequestContext(request))
Тем не менее, я хочу:
- иметь лучший способ ссылки на легкую или тяжелую цепь в шаблоне, например, перебрать остатки цепи с помощью
{% for r in fab.light_chain.residue_set.all %}
. - убедитесь, что у каждого Fab есть только 1 легкая цепь и 1 тяжелая цепь
Я рассматривал подклассы Chain
, но точно не знал, как достичь аналогичного результата.Я придумал что-то вроде:
class Chain(Model):
# same as before, but without the fab ForeignKey field
...
class LightChain(Chain):
pass
class HeavyChain(Chain):
pass
class Fab(Model):
name = CharField(max_length=30)
light_chain = OneToOneField(LightChain)
heavy_chain = OneToOneField(HeavyChain)
...
class Residue(Model):
???
Основная проблема, с которой я столкнулся, состоит в том, как получить поля LightChain
и HeavyChain
, содержащие данные Residue
.В частности, чем я могу заменить ch = ForeignKey(Chain)
в классе остатков?
Будем весьма благодарны за любые предложения или ссылки.