Прямое присвоение обратной стороне связанного множества запрещено в пользовательском запросе Django
Итак, я пытаюсь использовать Django ORM нестандартным образом - я хочу получить отношения со связанными таблицами, но я пытаюсь сделать это через необработанный запрос - в основном потому, что мне нужно использовать ORDER BY RAND(), а не стандартный метод Django random query, потому что он существенно медленнее.
У меня такой запрос:
base_sql = "SELECT article_sentence.id, article_sentence.language_id, article_sentence.per_language_id, rule_mapping_sentence.rule FROM article_sentence "
join_sql = "JOIN rule_mapping_sentence ON (article_sentence.id = rule_mapping_sentence.sentence_id) "
where_sql = "WHERE article_sentence.id IN "
subquery_sql = "(SELECT sentence_id FROM rule_mapping_sentence GROUP BY sentence_id HAVING COUNT(*) >= 0) "
order_sql = "ORDER BY RAND() "
limit = "LIMIT " + str(number)
query = base_sql + join_sql + where_sql + subquery_sql + order_sql + limit
sentences = models.Sentence.objects.raw(query)
Однако я получаю:
TypeError: Direct assignment to the reverse side of a related set is prohibited. Use rule.set() instead.
Похоже, это связано с тем, как связаны мои модели.
Вот моя модель предложения:
class Sentence(models.Model):
sentence = JSONField(default=dict, null=True, )
json = JSONField(default=dict, null=True, )
per_language = models.ForeignKey(
PerLanguage,
on_delete=models.CASCADE,
null=True,
related_name="sentence"
)
language = models.ForeignKey(Language, on_delete=models.SET_NULL, null=True)
Вот моя модель правил:
class Rules(models.Model):
rule = models.CharField(max_length=50)
function = models.CharField(max_length=50)
definition = models.CharField(max_length=255)
argpos = models.PositiveIntegerField(null=True)
postprocess = models.CharField(max_length=50, null=True)
skill = models.ForeignKey(
SkillLevels, on_delete=models.CASCADE, null=True)
notes = models.CharField(max_length=255, null=True)
disabled = models.BooleanField()
И моя модель RuleMappingSentence:
class RuleMappingSentence(models.Model):
rule = models.CharField(max_length=100)
sentence = models.ForeignKey(Sentence, on_delete=models.CASCADE, related_name='rule')
class Meta:
db_table = 'rule_mapping_sentence'
В обычных ситуациях мои модели работают именно так, как я хочу - однако в этой конкретной ситуации мне нужно получить все правила на основе их предложения.
Есть ли лучший способ сделать это, чем тот, который я использую? Я не могу найти много информации об этой конкретной ошибке, но она определенно кажется связанной с моими модельными отношениями.