Я также сталкиваюсь с подобным вопросом. Но, наконец, я обнаружил, что задал неправильный вопрос, который нужно решить.
в Django ORM условие объединения SQL основано на том, что определены в полях models.Model
.
есть отношения многие-к-одному (ForeignKey
), отношения многие-ко-многим (ManyToManyField
), отношения один-к-одному (OneToOneField
).
в вашей ситуации. ObjectLock
Модель и ObjectImportQueue
Модель имеют одинаковую часть полей, поле partner
и object_id
field.yon должны использовать отношения «один к одному».
Вы можете изменить свою модель следующим образом:
class ObjectImportQueue(models.Model):
partner = models.ForeignKey(Partner)
object_id = models.CharField(max_length=100)
created = models.DateTimeField(auto_now_add = True)
modified = models.DateTimeField(auto_now = True, db_index=True)
def __unicode__(self):
return u"%s:%s" % (self.partner, self.object_id)
class Meta:
ordering = ('modified', 'created')
class ObjectLock(models.Model):
lock = models.OneToOneField(ObjectImportQueue, null=True)
class Meta:
unique_together = (('lock',),)
порядок Model является импортом, OneToOneField
аргумент модели должен стоять первым.
>>> p1 = Partner.objects.get(pk=1)
>>> p2 = Partner.objects.get(pk=2)
>>> Q1 = ObjectImportQueue.objects.create(partner=p1,object_id='id_Q1')
>>> Q2 = ObjectImportQueue.objects.create(partner=p2,object_id='id_Q2')
>>> ObjectImportQueue.objects.filter(lock__isnull=True)
[<ObjectImportQueue: Partner object:id_Q1>, <ObjectImportQueue: Partner object:id_Q2>]
>>> L1 = ObjectLock.objects.create(lock=Q1)
>>> ObjectImportQueue.objects.filter(lock__isnull=True)
[<ObjectImportQueue: Partner object:id_Q2>]
ObjectLock.objects.create
заблокировать объект
ObjectImportQueue.objects.filter(lock__isnull=True)
выберите объект не быть заблокированным.
если вы используете соответствующие отношения, генерировать запрос ORM будет легко. В Django , Определить отношения во время построения модели лучше, чем использовать оператор Query для связи между таблицами.