Прямое присвоение обратной стороне связанного множества запрещено в пользовательском запросе 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'

В обычных ситуациях мои модели работают именно так, как я хочу - однако в этой конкретной ситуации мне нужно получить все правила на основе их предложения.

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

Вернуться на верх