我有一个与此类似的ManyToManyField模型(模型Word也有一种语言):
class Sentence(models.Model):
words = models.ManyToManyField(Word)
language = models.ForeignKey(Language)
def clean(self):
for word in self.words.all():
if word.language_id != self.language_id:
raise ValidationError('One of the words has a false language')
Run Code Online (Sandbox Code Playgroud)
在尝试添加新句子时(例如通过django admin),我得到了'Sentence' instance needs to have a primary key value before a many-to-many relationship can be used.这意味着在保存之前我无法访问self.words,但这正是我想要做的.有没有办法解决这个问题,所以你可以验证这个模型吗?我真的想直接验证模型的字段.
我发现了很多关于这个例外的问题,但我无法找到解决问题的方法.我很感激任何建议!
io_getevents乍一看,通知机制看起来非常强大,所以我想要一些可以与它一起使用的东西。我只是还没找到任何东西。在 Windows 上,这很简单:只有TransmitFile,它可以异步工作(重叠),并且如果需要的话可以使用某种通知机制(IOCP、事件)。Linux 上一定有类似的东西,对吗?或者,将我的问题放在某种背景下,我将如何在 Linux 上创建一个高效的文件服务器?
我有以下型号:
class Street(models.Model):
name = models.CharField(max_length=40)
class House(models.Model):
street = models.ForeignKey(Street, models.PROTECT)
number = models.CharField(max_length=10)
class Meta:
unique_together = ('street', 'number')
class Room(models.Model):
house = models.ForeignKey(House, models.PROTECT)
number = models.CharField(max_length=10)
class Meta:
unique_together = ('house', 'number')
Run Code Online (Sandbox Code Playgroud)
我已经知道a的ID,Street并希望获取该街道上所有房屋的所有房间。在SQL中,这很简单:
SELECT *
FROM room JOIN house ON house.id = room.house_id
WHERE house.street_id = xyz;
Run Code Online (Sandbox Code Playgroud)
现在如何在Django中执行此操作?我试过了
Room.objects.select_related('house').filter(street=xyz)
Run Code Online (Sandbox Code Playgroud)
但是我收到一个例外,说我无法访问此字段:
django.core.exceptions.FieldError: Cannot resolve keyword 'street' into field. Choices are: house, house_id, id, number
Run Code Online (Sandbox Code Playgroud)
由于我面临的数据量很大,我真的很希望能够使用单个查询进行联接和过滤!当放弃一个或另一个时,我将不得不诉诸于多个查询或在Python中进行过滤,这两种方法本质上都是效率低下的。我猜还有一种替代方法是原始查询。